具有自引用的对象和数组

时间:2015-07-02 20:08:50

标签: javascript

我对理解JavaScript行为非常感兴趣。

对象:

object = {object : window.object};
object = {object : window.object};

console.log(object === object); // true
console.log(object.object === object); // false
console.log(object.object === object.object); // true
console.log(object.object.object === object.object); // false

数组:

array = [window.array];
array = [window.array];

console.log(array === array); // true
console.log(array[0] === array); // false
console.log(array[0] === array[0]) // true
console.log(array[0][0] === array[0]) // false

为什么

object.object.object === object.object

返回false ???

3 个答案:

答案 0 :(得分:2)

在第一次分配后,您有以下内容:

object = { object: undefined }

第二个作业创建一个对象,其object属性包含之前的window.object值,并将其分配给object。所以现在你有了:

object = { object: { object: undefined } }

目前,object.object{ object: undefined },与object不同。

数组示例也会发生类似情况。

如果要创建自引用对象,则需要执行以下操作:

object = {};
object.object = object;

这不会在第二个赋值中创建一个新对象,它会修改原始对象。然后你可以这样做:

console.log(object.object.object.object === object); // true

对于数组,它将是:

array = [];
array[0] = array;
console.log(array[0][0][0][0][0] === array); // true

答案 1 :(得分:1)

window.object有两项任务。第一个创建一个新对象并将其分配给window.object。那个有一个名为“object”的属性,其值为undefined,因为在评估对象文字的时候window.objectundefined

第二个赋值实例化一个新对象。那个有一个名为“object”的属性,其值是在第一个赋值中创建的对象。

因此,window.objectwindow.object.object不是同一个对象。

关键是在这样的作业中:

object = { object: window.object };

对象文字中“object”属性的值在 之前进行评估。

答案 2 :(得分:0)

让我们逐行解释

    object = {object : window.object};
    //here object.object is undefined and object new object so object !== object.object
    //lets obj1 = {object: undefined}

    object = {object : window.object};
    //here object is new instance of Object while object.object is equal to older object
   //basically object != object.object 
    // obj2 = {object: obj1}
    console.log(object === object); // true because same object obj2 == obj2
    console.log(object.object === object); // false because two different object  as obj1 != obj2
    console.log(object.object === object.object); // true because same object obj1 == obj1
    console.log(object.object.object === object.object); // false because undefined != obj1