JS连续赋值与求值顺序

Posted 慕容文刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS连续赋值与求值顺序相关的知识,希望对你有一定的参考价值。

以下代码输出什么? 为什么?
var a = {n:1}; 
var b = a;  
a = {n:2}; 
a.x = a ;
console.log(a.x);
console.log(b.x);
var a = {n: 1}
var b = a;
a.x = a = {n: 2};
console.log(a.x);
console.log(b.x)

 

 

  第一个问题:

a.x ---> {n:2,x:a};
b.x ---> undefined;

解答:a的值很清晰了,a第二次赋值以后变成了{n:2},随后添加了x属性指向自身。而对于b,在a第二次赋值以后,由于js中给变量赋值为object类型时,变量中存储的是对这个object的引用。
此时,a指向{n:2} ,而b指向了{n:1} ,a和b指向不同的对象,因此,在a上添加属性对于b无影响,b.x自然就是undefined。

  第二个问题:

  解答:第三句里的主要难点在js运算符的优先级,访问属性、调用方法运算符"."的优先级高于赋值运算符。因此执行顺序是

  1. 给a添加属性x,此时a,b都是 { n:1,x:undefined },a.x 运算后的结果即为这个object(可以说也就是b)的x属性值。
  2. 把{n:2}赋值给a,此时a是 {n:2},是一个新的对象。 b是{ n:1,x:undefined }。

    由于( .  运算符最先计算)一开始js已经先计算了a.x,便已经解析了这个a.x是对象A的x,所以在同一条公式的情况下再回来给a.x赋值,也不会说重新解析这个a.x为对象B的x。

    所以 a.x=a 应理解为对象A的属性x指向了对象B:

    (这个时候a.x 已经运算完了,不会再与a产生任何关系,a.x依旧代表那个n为1对象的x属性值,和a已经没关系了。)
  3. 把{n:2}赋值给a.x 也就是 { n:1,x:undefined }这个对象的x属性,这个时候b依旧指向这个object,因此此时,a是{n:2},b是{n:1,x:{n:2}}





以上是关于JS连续赋值与求值顺序的主要内容,如果未能解决你的问题,请参考以下文章

CSDN之C技能树学习:15 - 运算符优先级与求值顺序

CSDN之C技能树学习:15 - 运算符优先级与求值顺序

知识点 47 三角函数式的化简与求值

三角函数式的化简与求值20201128

高考数学难点突破_难点16_三角函数式的化简与求值

“从右到左的运算符关联性”是不是与 javaScript 中赋值运算符中的求值顺序相同