instanceof操作符
if(value instanceof Array){}
其实就是判断是不是Array对象的实例,那就会有问题:
- 如果存在两个以上不同的全局执行环境,就会出现两个以上不同的Array构造函数。
- 如果从一个全局环境创建出来的数组放到另一个全局环境中判断,那该数组自然就不是当前全局环境下Array构造函数的实例了。
- 比如iframe内嵌网页,向内嵌网页传入对象判断。
Array is Array()
if(Array is Array(value)){}
ECMAScript5新增了Array is Array()方法,这个方法最终的目的就是判断是不是数组,不会考虑在哪个全局环境。
Object.prototype.toString.call()
Object.prototype.toString.call(value) //如果value是数组就会返回"[object Array]"
有时候,我们是要判断对象或变量是什么类型,并不知道是不是数组,所以不会用以上两种。而是要用上面这一种。
因为在任何值上面调用Object的toString方法都会返回一个[Object NativeConstructorName]格式的字符串(与全局作用域无关,返回的值能保持一致),每个类都有一个[class]属性,这个属性值就是构造函数名。