听说你会对象
发布于 7 年前 作者 zhang14725804 3721 次浏览 来自 问答

var a = {n: 1} var b = a; a.x = a = {n: 2} console.log(a.x); console.log(b.x);

什么结果,,解释一下

6 回复

这个是数组?

你要这样问,我肯定说我不会

@T-Roc 不好意思写错了

和对象无关,我理解为对连等的解析和运算优先级,核心是 . 优先于 =连等从右到左运行且等式左边的引用确定于运行前 a.x = a = {n: 2}

  1. 首先有a.x,最先运行,没有a.x, 创建一个a.x 指向undefined先,此时a === b === {n:1, x:undefined}
  2. 从右到左运行,a = {n:2} 把a的引用指向一个新对象{n:2} , 此时 新a === {n:2}, b === {n:1, x:undefined} === 旧a
  3. a.x = [Object](===新a), 注意此时左边a.x中的a还是旧a, 此时 a === {n:2}, b=== {n:1, x: [Object]}

等这行运行完了,现在a的指向是{n:2} ,b仍指向是有了新属性x的旧a,也就是{n:1,x:Object}

这样写程序是作死,作为题目还是可以一看的…浓浓的谭浩强风…错就错在容易忽略a.x优先级高这点

回到顶部