1.引用类型赋值问题

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

前提基础知识点:

  1. 引用类型赋值:
  • 引用类型复制的时候,两个变量作为指针指向同一个对象
  • 变量赋值的时候是将该变量指向另一个对象
  • 通过点表示法,访问修改属性的时候,所指向的对象地址不变
  1. 操作符
  • 点操作符号的优先级很高,仅次于(),方向是从左到右
  • 赋值操作符的方向是从右到左。

操作符参考链接:MDN

现在来分析上面的代码,1、2两句将a、b这两个变量都指向{n:1}(对象A)这二个对象,主要令人困惑的是第三句代码,由于.操作符的优先级a.x最先执行,即是给{n:1}添加一个x属性,因此它变成{n:1,x:undefined}(对象A),然后再执行a = {n:2},即是将a指向另一个对象{n:2}(对象B),此时a和b已不是指向同一个对象了,最后执行a.x = a,可以理解为将对象A的属性x指向了对象B。因此

a.x = undefined
b.x = {n:2}

画一个图一目了然:


内存图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容