对象属性的双重分配导致未定义的属性[重复]
Posted
技术标签:
【中文标题】对象属性的双重分配导致未定义的属性[重复]【英文标题】: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 太好了!!我最终有一个很好的问题要收藏:) 【参考方案1】:foo.x = foo = n: 2 ;
foo.x
指的是foo
所引用对象的属性x
。但是,foo = n: 2
将一个全新的对象分配给foo
。 x
确实分配给了一个对象,但该对象立即被另一个对象替换。具有x
属性的对象不再被任何东西引用。
你可以把那一行读成
foo.x = (foo = n: 2 );
图解说明
var foo = n: 2 ;
foo.x = foo = n: 2 ;
console.log(foo.x);
【讨论】:
据我所知,赋值表达式是从右到左求值的... 它们是,但foo.x
仍然指的是前一个对象。
根据***.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”键
【讨论】:
是吗?不是从右到左求值的赋值表达式吗? 什么?分配是顺序的!你应该按顺序解释每一行以上是关于对象属性的双重分配导致未定义的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]