出于好奇,我只想知道原因。
所有数组方法,例如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);
这背后有什么原因吗?
最佳答案
为什么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
是可能的。但是,对于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/