对象属性的双重分配导致未定义的属性[重复]

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 将一个全新的对象分配给foox 确实分配给了一个对象,但该对象立即被另一个对象替换。具有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”键

【讨论】:

是吗?不是从右到左求值的赋值表达式吗? 什么?分配是顺序的!你应该按顺序解释每一行

以上是关于对象属性的双重分配导致未定义的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

监视属性中的Vuejs未定义对象[重复]

JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]

如何从数组中删除重复值?当数组内的对象属性未定义时,我的代码失败

打字稿对象可能未定义[重复]

Jquery对象分配给变量返回未定义[重复]

未捕获的类型错误:无法设置未定义的属性 [重复]