Double-assignment of an object property results in undefined property [duplicate]

妖精的绣舞 提交于 2019-12-20 04:53:59

问题


Can anyone tell how the output became undefined?

var foo = {n: 2};
foo.x = foo = {n: 2};
console.log(foo.x); // undefined

回答1:


foo.x = foo = {n:2};

The foo.x refers to the property x to the object refered to by foo. However, foo = {n:2} assigns a completely new object to foo. x is indeed assigned to an object, but that object is immediately replaced by another object. The object with the x property isn’t referenced by anything anymore.

You can read that line as

foo.x = (foo = {n:2});

Graphical explanation

var foo = {n:2};

foo.x = foo = {n:2};

console.log(foo.x);




回答2:


I'll break down the assignment and output of each variable as it plays out.

var foo = {n:2}
# foo: Object {n: 2}
# foo.x: undefined

foo.x = 3
# foo: Object {n: 2, x: 3 }
# foo.x: 3

foo.x = foo
# foo: Object {n: 2, x: Object {n:2, x: Object (recursive) } }
# foo.x: Object {n: 2, x: Object {n:2, x: Object (recursive) } }

foo.x = foo = {n: 2}
# foo: Object {n: 2}
# foo.x: undefined

The last line, as you can see, resets foo to equal {n: 2} which makes foo.x non-existent (because you have overwritten the foo object)




回答3:


Your code is exactly the same as this one,

    var foo = {n:2}; // foo ==> {n:2}
    foo.x = {n:2}; // foo ==> {n:2,x:{n:2}}
    foo = {n:2}; // foo ==> {n:2}
    console.log(foo.x); // undefined 

because there's no "x" key in your object



来源:https://stackoverflow.com/questions/37793432/double-assignment-of-an-object-property-results-in-undefined-property

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!