Javascript 具有自引用的对象和数组

Javascript 具有自引用的对象和数组,javascript,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

我对理解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
为什么


返回false???

有两个赋值给
window.object
。第一个创建一个新对象并将其分配给
window.object
。其中有一个名为“object”的属性,其值为
未定义
,因为在计算对象文本时
窗口。object
未定义

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

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

关键是在这样的作业中:

object = { object: window.object };

对象文字中“object”属性的值在赋值之前进行计算。在第一次赋值之后,您有以下内容:

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

让我们逐行解释

    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 

为什么定义变量两次,然后覆盖它?编辑:ok;)如果你知道答案,为什么要发布这个问题?那么有两个对象?是的,有两个对象。为什么没有呢?每个不同的对象文字表达式都会创建一个新对象。
    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