JavaScript代码技巧:foo.x的值是多少?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (491)

我在Github前端访谈问题集中遇到了这个问题:

var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2}; 问题:foo.x的价值是多少?

答案是undefined

我做了一些研究,我明白这个问题是:

  • var foo = {n: 1};声明一个foo属性n等于1 的对象。
  • var bar = foo;声明了一个bar引用相同对象的对象foo。
  • foo.x = foo = {n: 2}; 我认为这等于 foo.x = (foo = {n: 2});
  • 然后我得到了foo.x平等undefined。但是,值bar.x是对象{n:2}。

如果bar和foo是指同一个对象,为什么bar.x得到的价值,同时foo.x为undefined?真正发生了foo.x = foo = {n: 2}是什么?

提问于
用户回答回答于

理解的是,对象变量仅仅是对JavaScript中对象的引用,而不是对象本身

var foo = {n: 1}- > foo指的是真实对象{n:1} var bar = foo- > bar现在也是对真实对象的引用{n:1}

棘手的部分当然是第3行: foo.x = foo = {n: 2},相当于: (reference to {n: 1}).x = (foo = {n: 2})- >在完全评估此行之后,foo成为对新对象的引用{n:2}; 但是,由于foo {n: 1}在评估线之前引用原始对象,因此原始对象在评估线之后{n: 1}变为{n: 1, x: [reference to]{n: 2}},并且可以通过引用访问修改后的对象bar

用户回答回答于

那些最后的变量赋值等同于写入bar.x = foo = {n:2};,因为这些变量只是对内存中同一事物的引用。

换句话说,foo和bar被中,首先,两个引用相同的对象,{n:1}。使用时foo.x =,你正在访问{n:1}并向其添加x属性,可以使用bar或者foo因为它们都指向内存中的同一个对象!没什么区别。

然后,当你完成该行时,foo.x = foo = {n:2}将通过对象文字语法在内存中创建另一个全新的对象,并设置foo为指向对象{n:2},而不是现在的对象{n:1, x: {n: 2}。

扫码关注云+社区

领取腾讯云代金券