对于数组的判断,我之前用过constructor。这玩意儿就是一个属性,可以根据它的值是否为Array来判断。
如:
console.log([1,2,3].constructor==Array);
返回:
true
但是constructor这个单词太长了,我根本记不住。
前几日在面试时,被问到这个问题。如何判断是不是数组。我回答的是用hasOwnProperty。不过这个单词也太长来,我没记住。我只说出来has,后面如果在chrome的控制台或编辑器里会自动提示出来。
那么hasOwnProperty究竟是怎么判断数组的呢?
实际上,如果是数组,它的hasOwnProperty(0)就是true。如果不是数组,它的hasOwnProperty(0)就是false。
例如:
let x=[1,2,3];
console.log(x.hasOwnProperty(0));
显示
true
接下来看非数组
let x=1;
console.log(x.hasOwnProperty(0));
显示
false
然而,这里其实还是不严谨的。因为,字符串hasOwnProperty(0)也是true的。 不过没关系,判断是否是字符串就很简单了,用typeof就可以了。
也就是用typeof和hasOwnProperty(0)两者结合就可以判断是否是数组了。
const is_array=obj=>{
if(obj.hasOwnProperty(0) && typeof obj !='String'){
return true;
}else{
return false;
}
}
测试以下:
console.log(is_array([1,2,3]));
true
console.log(is_array(5));
false
好像没什么问题
但是:
console.log(is_array([]));
false
怎么空的数组就不对了?
原来,空的数组,[].hasOwnProperty(0)就是false。
因此,hasOwnProperty(0),果然是不严谨的。
那么还有别的更简单的方法吗?刚才查资料,发现基本都用到isArray、instanceof、toString、constructor等。
其实更好的方法一定是有的。
我平时操作数组,最多用到的是map。因此可以从map入手。这一点,网上似乎没有别人提到过。
以下是代码:
let x=5
x.map?true:false
结果为
false
let x=[1,2,3]
x.map?true:false
结果为
true
再测测其他类型的
let x=()=>{}
x.map?true:false
false
说明没什么问题。因为非数组的,根本就没有map方法。这可能是最简单最严谨的方法了。