Array.prototype.slice === [].slice // output true
console.log(Array.prototype) // output []
为什么以下条件为假(在计数中采用上述语句)
Array.prototype === [] //output (false)
答案 0 :(得分:2)
Array.prototype
是一个数组本身,console.log
是任何空数组(在Chrome ...中)输出[]
。
严格相等运算符(===
)比较两个数组之间的引用,而Array.prototype
与数组文字的引用不同。
答案 1 :(得分:2)
这是因为内存位置。
例如,假设您有两个对象{A}
和{B}
。是的,都属于Object.prototype
;但是,这并不意味着{A} === {B}
。它们不一定具有相同的属性或存在于相同的内存位置。
同样,Array.prototype
会创建一个空白数组[]
,就像输入数组文字[]
一样。然而,这两个调用是不同的,因为Array.prototype
返回所有数组的be-all和end-all,而[]
只是在内存中实例化一个新数组。它们都在控制台中“返回”相同的东西,但实际上是完全不同的。这就是Array.prototype === Array.prototype
返回true
,而[] === []
返回false
的原因。关于"Inheritance and the prototype chain"的MDN文章很好地解释了.prototype
在JavaScript中的工作原理。
那么,当Array.prototype === []
返回true时,为什么Array.prototype === Array.prototype
确实返回false,考虑Array.prototype
会返回[]
?嗯,这与说var arr1 = []
和var arr2 = []
相等是一样的;他们不是。
例如,当您有两个数组时:
var arr1 = [1,2,3];
var arr2 = [2,3,4];
您不会检查与if (arr1 === arr2)
的相等性,因为这只会告诉您它们是否存在于同一内存位置。相反,你循环并比较元素。它与Array.prototype === []
的概念相同,只是数组没有元素。
Array.prototype.slice === [].slice
返回true
的原因是因为它正在比较两个函数,它们都恰好是.slice
,这意味着它们占用并引用相同的内存位置。只有它们是平等的才有意义,因为它们确实是同一个东西。
console.log([].slice);
// returns:
/*
function slice() {
[native code]
}
*/
// console.log(Array.prototype.slice) returns the same thing.
尝试Array.prototype.slice === [].splice
- 它返回false。两个不同位置的两个不同功能。那么Array.prototype.slice() === [].slice()
呢?它返回false?什么?为什么呢?
因为等于运算符的每一侧都引用了两个不同的内存位置。你在两个不同的数组上调用.slice
,所以现在你要比较两个不同数组的两个不同切片,因此false
返回。
答案 2 :(得分:1)
没有进入原型继承的东西......
两个对象可以不同,但它们的一些属性可以引用相同的东西。
var same = {};
var a = {test: same};
var b = {test: same};
console.log(a.test === b.test); // true
console.log(a === b); // false
a.name = 'a';
console.log(b.name); // undefined, because b is a different object
a.same.name = 'arnold';
console.log(b.same.name); // arnold