用map判断javascript类型是否是数组

1,077 阅读2分钟

对于数组的判断,我之前用过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方法。这可能是最简单最严谨的方法了。