出于好奇,我只是想知道原因。
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);

这背后有什么理由吗?
答案 0 :(得分:4)
为什么
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年航行,所以......)
答案 1 :(得分:2)
如果对象不是typeof数组。在这种情况下,我们必须将方法isArray()添加到所有数据类型。
例如string.isArray()将返回false,object.isArray()将返回false等。
ponury-kostek也在评论中指出了这一点。尝试使用null或undefined执行此操作。这是不可能的
最好将它作为一个接受输入并验证它的函数
答案 2 :(得分:0)
任何Object
都可以拥有.isArray()
属性:
o = { isArray: () => true }
console.log(o.isArray()) // true
a = []; a.isArray = () => false
console.log(a.isArray()) // false

或.prototype.isArray()
:
Object.prototype.isArray = () => true
Array.prototype.isArray = () => false
console.log({}.isArray(), [].isArray()) // true false

更新没关系..
Array.isArray = () => false
console.log(Array.isArray([])) // false

但你仍然可以添加它:
Object.prototype.isArray = false
Array.prototype.isArray = true
console.log([].isArray, {}.isArray, "".isArray, (0).isArray, (false).isArray) // but doesn't work for null and undefined