出于好奇,我只想知道原因。
所有数组方法,如 map
、forEach
、reduce
都写在 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);
这背后有什么原因吗?
最佳答案
Why
isArray()
is written onArray
instead ofArray prototype
?
如果答案是“不,它不是一个数组”:
let obj = {};
let isArray = obj.isArray(); // TypeError: obj.isArray is not a function
isArray
的目的是提供一种方法来检查可能是数组也可能不是数组的东西是否是数组。如果 isArray
在 Array 原型(prototype)上,除非答案是“是的,它是一个数组”,否则它将不可访问。
公平地说,本来可以将 isArray
放在 Object.prototype
上并让它返回 false
,然后在 Array.prototype
中覆盖它以返回 true
。不过,对于 undefined
和 null
,这仍然会失败:
let x = null;
let isArray = x.isArray(); // TypeError: Cannot read property 'isArray' of null
...并且会不必要地污染标准库中所有其他对象类型的成员列表。将它设为静态,您可以将要测试的事物作为参数调用,这更有意义 — 在添加 Array.isArray
的地方。 (可能更有意义的是 typeof
的工作方式与它的工作方式根本不同,但那艘船于 1995 年航行,所以......)
关于javascript - 为什么 `isArray()` 写在 `Array` 而不是 `Array prototype` 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46341746/