判断是否是数组和对象的几种方法

参考:https://www.cnblogs.com/fogwind/p/5884684.html
https://blog.csdn.net/aaa333qwe/article/details/80331153

1.typeof
使用typeof来检测数据类型,但是对于Function, String, Number, Undefined等这几种基本类型来说,使用typeof来检测都可以检测到,比如代码如下:

function test(){}
console.log(typeof 1); // number
console.log(typeof test); // function 
console.log(typeof "yunxi"); // string
console.log(typeof undefined); // undefined

但是对于数组或者正则来说,使用typeof来检测的话,那就满足不了,因为当我们检测数组或者正则的话,那么返回的类型将会是一个对象object,如下代码所示:

console.log(typeof []);  // object
console.log(typeof {}); // object
console.log(typeof null); // object  // null是一个空对象
console.log(typeof function(){}); // function
console.log(typeof NaN); // number
console.log(typeof undefined); // undefined
console.log(typeof /\d+/g); // object

所以:typeof是有问题的。

2. objectName instanceof Array

使用instanceof操作符。instanceof操作符用来判断要检测对象的原型链上是否存在某个构造函数的prototype属性。

语法: A instanceof B,意思是对象A的原型是否是B.prototype。如果是,返回true,如果不是,返回false。

var a = [];
var b = {};
var c= function(){};
console.log(a instanceof Array); // true
console.log(a instanceof Object); // true  数组也是对象
console.log(a instanceof Function); // false  
console.log(b instanceof Array); // false
console.log(b instanceof Object); // true
console.log(b instanceof Function); // false
console.log(c instanceof Array); // false
console.log(c instanceof Object); // true 函数也是对象
console.log(c instanceof Function); // true

使用instanceof操作符有一个问题就是,它假定只有一个全局作用域。如果一个网页中有多个框架(iframe元素),那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。传入的数组在该框架中用instanceof操作符判断就会返回false。

var a = {};
var b = [];
console.log(a instanceof Object);//true
console.log(b instanceof Array);//true
var frame = document.createElement("iframe"); // 创建一个框架
document.body.appendChild(frame);
console.log(window.frames);
console.log(window.frames[0]);
console.log(window.frames[0].Array); // ƒ Array() { [native code] }
var c = window.frames[0].Array; // 取得框架全局执行环境中的Array构造函数
var d = new c(); // 在框架全局执行环境中创建一个数组d
console.log(d instanceof Array); // 在当前页面的执行环境中用instanceof操作符判断d是否为数组,返回false
console.log(Array.isArray(d)); // true

3. objectName.constructor == Array

var a=[]; // 数组
var b={}; // 对象
var c=function(){}; // 函数
var d=null;
var e=NaN;
var e=undefined;
console.log(a.constructor); // ƒ Array() { [native code] }
console.log(b.constructor); // ƒ Object() { [native code] }
console.log(c.constructor); // ƒ Function() { [native code] }
// console.log(d.constructor); // Uncaught TypeError: Cannot read property 'constructor' of null
console.log(e.constructor); // ƒ Number() { [native code] }
// console.log(f.constructor); // Uncaught TypeError: Cannot read property 'constructor' of undefined

console.log(a.constructor === Array); // true 只有数组的constructor是Array
console.log(a.constructor === Object); // false
console.log(a.constructor === Function); // false

console.log(b.constructor === Array); // false
console.log(b.constructor === Object); // true  只有对象的constructor是 Object
console.log(b.constructor === Function); // false

console.log(c.constructor === Array); // false
console.log(c.constructor === Object); // false
console.log(c.constructor === Function); // true 只有函数的constructor是 Function

// console.log(d.constructor); // 报错
console.log(e.constructor === Number); // true

2、3判断有误差。
a)在不同 iframe 中创建的 Array 并不共享 prototype (2)
b)即使为true,也有可能不是数组。 (3)

function SubArray(){}
SubArray.prototype = [];
myArray = new SubArray;
console.log(myArray instanceof Array); // true

4. Array.isArray(objectName);

这个方法的作用就是确定某个值到底是不是数组,而不管它到底是在哪个全局执行环境中创建的。

console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
console.log(Array.isArray(null)); // false
console.log(Array.isArray(undefined)); // false
console.log(Array.isArray(function(){})); // false

5. Object.prototype.toString.call(objectName)

console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(function(){})); // [object Function]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(NaN)); // [object Number]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call('abc')); // [object String]
console.log(Object.prototype.toString.call(false)); // [object Boolean]

综上:
1.判断是否为数组:可以使用Array.isArray()和Object.prototype.toString.call()方法
2.判断是否为对象:使用Object.prototype.toString.call()方法

猜你喜欢

转载自blog.csdn.net/weixin_42995876/article/details/87985843