JS的典范题目之一就是“检测一个对象是否是数组”,本文总结了3种检测要领。
instanceof检测要领
var arr = [];
if (arr instanceof Array) {
// do something
}
存在题目instanceof
操作符假定只要一个全局实行环境。假如网页中包括多个框架,那实际上存在两个以上的差别全局实行环境,从而存在两个以上差别版本的Array组织函数。假如从一个框架向另一个框架传入数组,那末传入的数组与第二框架中原生的数组离别具有各自差别的组织函数。从而将传入的数组误判为非数组。
假如只要一个全局实行环境,能够用 instanceof
检测数组。
Array.isArray()要领
var arr = [];
if (Array.isArray(arr)) {
// do something
}
这个要领克服了instanceof
的题目,能够肯定某个变量是否是数组,而不论它是在哪一个全局实行环境中建立的。
然则支撑Array.isArray()
要领的浏览器有IE9+、Firefox4+、Safari5+、Opera10.5+和Chrome。关于不支撑这个要领的浏览器怎么办呢?第三种——全能要领。
全能要领
function isArray(arr) {
return Object.prototype.toString.call(arr) == '[object Array]';
}
var arr = [];
isArray(arr);
道理
在任何值上挪用Object原生的toString()
要领,都邑返回一个[object NativeConstructorName]
花样的字符串。每一个类在内部都有一个[ [Class] ]属性,这个属性就指定了上述字符串中的组织函数名NativeConstructorName
。如:
var arr = [];
console.log(Object.pototype.toString.call(arr)); // "[object Array]"
这类思绪也可用于检测某个值是否是原生函数或正则表达式。
// Array
Object.prototype.toString.call(value); // "[object Array]"
// Function
Object.prototype.toString.call(value); // "[object Function]"
// RegExp
Object.prototype.toString.call(value); // "[object RegExp]"
// Date
Object.prototype.toString.call(value); // "[object Date]"
Object的toString()要领不能检测非原生的组织函数的组织函数名,因而,开发人员定义的任何组织函数都将返回[object Object]。