数组原型和文字

时间:2014-07-29 19:12:46

标签: javascript prototype

Array.prototype.slice === [].slice  // output true
console.log(Array.prototype) // output  []

为什么以下条件为假(在计数中采用上述语句)

Array.prototype === [] //output (false)   

3 个答案:

答案 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
相关问题