之前strong去见了大神回来问我,怎么判断一个变量是数组,至少要用三种方法。
参见一篇来自前端大全的文章
参考链接在这里
isArray()
照理说这个方法是最简便的方法。
if(Array.isArray(value)){}
但是这个方法在IE9以下的浏览器并不支持
typeof()
数组是特殊的对象,所以数组的typeof结果是object。然而,null的typeof结果也是object。所以要用typeof的话就得写成
var a = [1,2,3];
//是object且要排除null和纯对象
console.log(
(typeof a === 'object' && a !== null && Object.prototype.toString.call(a) !== '[object Object]')); //true
instanceof()
对于一个网页或者一个全局作用域而言。这个方法是有效的
if(a instanceof Array){//...}
但是如果这个页面嵌套了frame暂且叫做a.html。
这个frame里定义了window.a= [1,3,5];
那么
window.onload = function(){
var a = window.frames[0].a;
console.log(a instanceof Array); //false
console.log(a.constructor === Array); //false
}
这是因为每个 frame 都有一套自己的执行环境,跨 frame 实例化的对象彼此不共享原型链。如果打印 a instanceof window.frames[0].Array,那么结果就是 true 了。
特性嗅探
var b = [3,4,5];
if(b.sort){//.....}
这样一旦某个对象正好有值为sort的key的话,就会有问题。
比如:
var b = {sort:'aaa'};
这样的话b.sort也是true,所以也不能用。
最靠谱的方法应该是
Object.prototype.toString.call(value)
这个方法的原理是:
每个对象有一个叫做class的内部属性,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串输出。