为什么`isArray()`写在`Array`而不是`Array prototype`上?

时间:2017-09-21 10:38:36

标签: javascript arrays

出于好奇,我只是想知道原因。

mapforEachreduce等所有数组方法都写在Array.prototype上,所以我可以像这样使用



let sum = [1,2,3,4,5].reduce( (acc, value) => acc+value, 0);
console.log(sum);




与所有这些方法不同,isArray()用法就像



let isArray = Array.isArray([1,2,3]); // I can't use [1,2,3].isArray(); :(
console.log(isArray);




这背后有什么理由吗?

3 个答案:

答案 0 :(得分:4)

  

为什么isArray()写在Array而不是Array prototype

如果答案是“否,它不是数组”:

let obj = {};
let isArray = obj.isArray(); // TypeError: obj.isArray is not a function

isArray的目的是提供一种检查某个数组是否可能是数组的方法。如果isArray在Array原型上,那么除非答案为“是,它是一个数组。”否则它将无法访问。

公平地说, 可以将isArray放在Object.prototype上并让它返回false,然后在Array.prototype覆盖它}返回true。但undefinednull仍然会失败:

let x = null;
let isArray = x.isArray(); //  TypeError: Cannot read property 'isArray' of null

...并且会不必要地污染标准库中所有其他对象类型的成员列表。将它作为一个参数测试的东西调用为静态更有意义 - 在添加Array.isArray的时候。 (可能更有意义的是typeof从根本上不同于它的工作,但那艘船在1995年航行,所以......)

答案 1 :(得分:2)

如果对象不是typeof数组。在这种情况下,我们必须将方法isArray()添加到所有数据类型。

例如string.isArray()将返回false,object.isArray()将返回false等。

ponury-kostek也在评论中指出了这一点。尝试使用null或undefined执行此操作。这是不可能的

最好将它作为一个接受输入并验证它的函数

答案 2 :(得分:0)

任何Object都可以拥有.isArray()属性:



o = { isArray: () => true }
console.log(o.isArray())      // true 

a = []; a.isArray = () => false
console.log(a.isArray())      // false




.prototype.isArray()



Object.prototype.isArray = () => true
Array.prototype.isArray = () => false
console.log({}.isArray(), [].isArray()) // true false




更新没关系..



Array.isArray = () => false
console.log(Array.isArray([]))    // false




但你仍然可以添加它:



Object.prototype.isArray = false
Array.prototype.isArray = true

console.log([].isArray, {}.isArray, "".isArray, (0).isArray, (false).isArray) // but doesn't work for null and undefined