首页  >  问答  >  正文

javascript - JS中一个赋值的问题

javascript中的赋值我们都知道,是从右至左的

var a = b = c

上面的语句实际执行时是这样的

b = c
var a = b

但是如果有对象参与进来呢?昨天看到的一个例子

var foo = { a: 2 }
var bar = foo 
foo.x = foo = { b:  3 }

前两行很简单,就是将bar也指向了foo。
第三行,刚开始是执行foo = { b: 3 },这样将foo重新指向了另一个对象。

接下来的一句foo.x = foo,这句我本来以为是foo.x指向foo,这样foo就成了一个循环引用自身的对象,即

foo = {
    b: 3,
    x: {
        b: 3,
        x: {
            b: 3,
            x: {
                ......
            }
        }
    }
}

但是实际测试发现,foo.x = foo这句里面的foo.x中的foo是指向bar,也就是还没重新赋值的foo,有点不太理解,感觉应该是解析时候是从左到右,但是实际执行会是从右到左这样?

过去多啦不再A梦过去多啦不再A梦2711 天前665

全部回复(9)我来回复

  • PHPz

    PHPz2017-05-18 10:53:04

    这个我刚刚看到了一个大神的讲解挺好的(正在查资料核对),对象的连等赋值,大概解释是这样的:foo.x = foo = { b: 3 },在解释器执行中先看foo.x 和foo是否已经创建如果未创建就创建它并且将他们都指向最右边的对象,明显foo创建了并且指向{ a: 2 },foo.x还未创建,于是创建它并且让它指向null,此时bar和foo都指向{a:2,x:null},再将他们都指向右边的对象{b:3},此时bar指向{a:2,x:{b:3}},foo指向{b:3};

    回复
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    最近刚讨论过这个问题,我们得出的结论是:foo.x 中的 foo 实际是对 { a: 2 } 的一个引用,但执行顺序还是从右到左的,这点没有疑问。

    var foo = { a: 2 }
    var bar = foo.a = 3
    console.log(bar) //3
    
    var foo1 = { a: 2}
    var bar1 = foo1.a
    foo1.a = 3
    console.log(bar1) //2

    回复
    0
  • 漂亮男人

    漂亮男人2017-05-18 10:53:04

    赋值,是一个表达式,
    结合性从右往左,即a = b = ca = (b = c)a = b = ca = (b = c)
    返回值是,等号右边那个表达式的返回值,即 b = c 的返回值是c返回值是,等号右边那个表达式的返回值,即 b = c 的返回值是c的值。

    回复
    0
  • 仅有的幸福

    仅有的幸福2017-05-18 10:53:04

    局部左到右(.),宏观右到左(=)。此 foo 非彼 foo 。

    foo.x = foo = { b:  3 }

    读到第二个 foo 时,已经从第一个 foo 获取了 { a: 2 } 的引用,等待给其 x 属性赋值。

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-18 10:53:04

    赋值是从右到左的,但执行之前必然对代码进行处理,foo.x = foo = { b: 3 },对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }这个对象的实际存储位置,对属性x的赋值也是对实际对象的x属性赋值,不管他是foo指向的对象,还是bar指向的对象。对对象的赋值是改变该对象存储的实际对象的地址,即修改了foo的指向。

    回复
    0
  • 高洛峰

    高洛峰2017-05-18 10:53:04

    我觉得这种写法没什么意义。
    在实际生产中,要是遇到很多这样的代码,你能一眼明白吗?
    就像现在,前面答题的,有多少能够通俗的说明白?

    回复
    0
  • 迷茫

    迷茫2017-05-18 10:53:04

    /a/11...

    回复
    0
  • 怪我咯

    怪我咯2017-05-18 10:53:04

    var a=b=c;
    
    b=c;//c
    a=c;
    foo.x = foo = { b:  3 }
    
    foo = { b:  3 };//返回值为 { b : 3 } 的指针,下同
    foo.x = { b : 3 }的指针;

    但是实际上按顺序执行上面三条语句,结果会有所不同,因为foo.x是在解析阶段已经准备好的,所以实际上指向的是bar.x

    实际上的等价代码

    foo.x = foo = { b:  3 }
    
    foo = { b:  3 };//{ b : 3 }
    bar.x = { b : 3 }的指针;

    回复
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    可以使用指针理解这个问题

    回复
    0
  • 取消回复