【问题标题】:Double-assignment of an object property results in undefined property [duplicate]对象属性的双重分配导致未定义的属性[重复]
【发布时间】:2016-10-14 02:08:31
【问题描述】:

谁能说出输出是如何变成undefined的?

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

【问题讨论】:

  • 有趣的是 test.x 不是未定义的,
  • 你想要这样的东西吗 foo.x = foo, {n:2};没有?
  • @le_m 想知道...你是怎么知道这个问题的?? :~)
  • @Shubh 我不久前投了赞成票 :)
  • @le_m 太好了!!我最终有一个很好的问题要收藏:)

标签: javascript assignment-operator


【解决方案1】:
foo.x = foo = { n: 2 };

foo.x 指的是foo 所引用对象的属性x。但是,foo = { n: 2 } 将一个全新的对象分配给foox 确实分配给了一个对象,但该对象立即被另一个对象替换。具有x 属性的对象不再被任何东西引用。

你可以把那一行读成

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

图解说明

var foo = { n: 2 };

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

console.log(foo.x);

【讨论】:

  • 据我所知,赋值表达式是从右到左求值的...
  • 它们是,但foo.x 仍然指的是前一个对象。
  • 根据stackoverflow.com/a/37763275/1625737,原因是它们实际上是从左到右评估的......
【解决方案2】:

我将分解每个变量的赋值和输出。

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

如您所见,最后一行将foo 重置为等于{n: 2},这使得foo.x 不存在(因为您已经覆盖了foo 对象)

【讨论】:

    【解决方案3】:

    你的代码和这个一模一样,

    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 
    

    因为您的对象中没有“x”键

    【讨论】:

    • 是吗?不是从右到左求值的赋值表达式吗?
    • 什么?分配是顺序的!你应该按顺序解释每一行
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2019-12-05
    • 2021-09-16
    • 2016-02-03
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多