javascript 连等赋值问题

javascriptvar a = {n:1};  
var b = a; // 持有a,以回查  
a.x = a = {n:2};  
alert(a.x);// --> undefined  
alert(b.x);// --> {n:2}

请问结果为何是这样?

我的理解是连等赋值从右向左运算的,当a被复制为{n:2}之后,

为什么a.x中的a仍然指向{n:1}?

阅读 28.7k
评论 2015-03-31 提问
    16 个回答
    xelz
    • 11.8k

    赋值是从右到左的,但不要被绕晕了, 其实很简单,从运算符优先级来考虑

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

    .运算优先于=赋值运算,因此此处赋值可理解为

    1. 声明a对象中的x属性,用于赋值,此时b指向a,同时拥有未赋值的x属性
    2. 对a对象赋值,此时变量名a改变指向到对象{n:2}
    3. 对步骤1中x属性,也即a原指向对象的x属性,也即b指向对象的x属性赋值

    赋值结果:

    a => {n: 2}
    b => {n: 1, x: {n: 2 } }    
    
    评论 赞赏 2015-03-31