「JavaScript学习笔记」JS 变量赋值小疑问

今天群里面讨论了一个小问题

var a = {n:1}
var b = a
a.x = a = {n:2}

console.log(a.x) // ?
console.log(b.x) // ?

一开始我的想法是

// 按赋值运算符优先级
a = {n:2}
a.x = {n:2}

// b指向a的值
// a.x  {n:2}
// b.x  {n:2}

正确答案是:

console.log(a.x) // undefined
console.log(b.x) // {n:2}

为什么会是这个答案呢?
首先,需要了解的是,js变量赋值,传递的不是变量的标识符地址,而是变量的值。基本类型(字符串、数字、布尔类型)进行值的复制,引用类型(对象)进行值的地址的引用。

var aString = 'abc'
var bString = aString // 值拷贝

var aObj = {n:1}
var bObj = aObj // 变量bObj 指向aObj 的值 : {n:1}

aObj.a = 1 // aObj 的值为 {n:1,a:1}
console.log(bObj)  // {n:1,a:1}
aObj = {c:1}  // aObj 的值为 {c:1}
console.log(bObj)  // {n:1,a:1}

// 值是复杂类型时,变量赋值是值的地址的拷贝

回到前面的问题,

var a = {n:1}
var b = a  // b指向对象{n:1}

// 这里是重点
a.x = a = {n:2} 
// a = {n:2}  使a指向对象{n:2}   
// 但同一行内连续赋值的话
// 最前面的a.x 的a 并没有因为 后面的 a = {n:2} 改变指向
// 而是仍指向{n:1} 这个对象
// 因此
console.log(a.x) // a 指向了 {n:2} 此时a没有属性x 所以undefined
console.log(b.x) // b 仍指向 {n:1} 而由于前面的a.x操作为它创建了属性x = {n:2}
// 因此结果是{n:2}

这题重点有两个,一个是变量赋值的操作,另一个是当连续等号赋值操作时,变量对应的值与分开写的区别。

方方老师点评:去了解编译原理,这跟js关系不大

23333

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,699评论 0 13
  • 第1章 JavaScript 简介 JavaScript 具备与浏览器窗口及其内容等几乎所有方面交互的能力。 欧洲...
    力气强阅读 4,886评论 0 0
  • 故事得从一千多年前说起,当时,唐三藏四人取得正果后,唯有悟空一人整天魂不守舍、无精打采,当玉帝问及他时,他只是淡淡...
    达粉阅读 1,540评论 0 0
  • 踅伏在天空沉静 给离家的人下蛊团聚的象征 尽管还天各一方 清辉的魔力 把相见的开心模拟成形 眼晴里褪去相思的痛 眼...
    一池凹水凸龙阅读 1,846评论 3 19
  • 今天是观音诞,女儿新村的同学妈妈们非常热情,邀请我们去吃饭,中午一家晚上一家!据说每年的这一天,他们都会非常隆重的...
    晨雨_7cec阅读 2,817评论 0 0