我对理解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 ???
答案 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.object
是undefined
。
第二个赋值实例化一个新对象。那个也有一个名为“object”的属性,其值是在第一个赋值中创建的对象。
因此,window.object
与window.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