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

标签 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);

这背后有什么原因吗?

最佳答案

Why isArray() is written on Array instead of Array 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。不过,对于 undefinednull,这仍然会失败:

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/

相关文章:

javascript - 如何设置对象数组的 redux 初始状态?

javascript - 防止 iframe 重新加载父窗口

javascript - 如何重新加载函数(事件)

javascript - 根据多个值或参数过滤 JSON 对象数组

arrays - 使用 React 钩子(Hook),我如何更新通过 Prop 传递给 child 的对象?

javascript - 订购 key :value pairs of objects

javascript - 读取 URL 中的单个变量的最简单方法是什么?

javascript - 如何在不打开打印对话框的情况下在angularJS中打印本地PDF

javascript - 如何在 Javascript 中从数组中提取值

python - 如何有效地将运算符应用于两个数组的笛卡尔积?