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

所有数组方法,例如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);





这背后有什么原因吗?

最佳答案

为什么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年航行,所以……)

关于javascript - 为什么`isArray()`是写在`Array`而不是`Array prototype`上的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46341746/

10-09 18:57