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

Mr.*_*r.7 1 javascript arrays

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

所有的数组方法,如map, forEach,reduce都写在上面Array.prototype,所以,我可以这样使用

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

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

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

这背后有什么原因吗?

T.J*_*der 5

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

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

let obj = {};
let isArray = obj.isArray(); // TypeError: obj.isArray is not a function
Run Code Online (Sandbox Code Playgroud)

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


说句公道话,它一直可能把isArrayObject.prototype,并使其返回false,然后覆盖它Array.prototype来回报true。但是,对于undefinedand仍然会失败null

let x = null;
let isArray = x.isArray(); //  TypeError: Cannot read property 'isArray' of null
Run Code Online (Sandbox Code Playgroud)

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

  • 因为当你知道它在数组上使用时你使用了 `reduce`,但是你在不知道它是否是数组的东西上使用了 `isArray`。 (2认同)