1.instanceof
- 使用方法:
arr instanceof Array //return true or false
- instanceof的原理是检查原型链,所以只能用于对象,不能用于基本类型。但对基本包装类型(Number、Boolean、String类型),因为其本质是引用类型,故能够用instanceof来判断。
- 缺点:instanceof假定只有一个全局环境,如果网页中包含多个框架,那实际上就存在多个不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。使用instanceof会返回false。
2.constructor属性
- 使用方法:
arr.constructor === Array //return true or false
- constructor是prototype对象的一个属性,默认指向prototype对象所在的构造函数。constructor属性的作用,是分辨原型对象到底属于哪个构造函数。
- 缺点:同instanceof一样,在不同的全局执行环境下,实例化的对象彼此不共享原型链,故使用constructor会返回false。
3.isArray
- 使用方法:
Array.isArray(value) //return true or false
- ECMAScript5新增,解决了在不同全局执行环境创建的问题。
- 支持Array.isArray()方法的浏览器有IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome。
4.Object.prototype.toString
- 使用方法:
Object.prototype.toString.call(arr) == "[object Array]" //return true or false
- 在任何值上调用Object原生的
toString()
方法,都会返回一个[object NativeConstructorName]
格式的字符串。每个类在内部都有一个[[class]]
属性([[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”),这个属性中就指定了上诉字符串中的构造函数名。 - 利用这个方法,再配合call,我们可以取得任何对象的内部属性
[[Class]]
,然后把检测类型转化为字符串进行比较。 - 因为
.toString()
方法可能会被改写,使用prototype
上的toString()
方法更加具有安全性。 - 这种方法在识别内置对象时往往十分有用,但对于自定义对象请不要使用这种方法。
网友评论