今天遇到了一个连续赋值的经典案例,网友们给出的答案也是五花八门,看起来有些繁琐,我也来说说自己的看法。

  下面就是这个经典案例:

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

  我们先来看一下普通连续赋值,即:变量赋值的类型是数据类型值

    var a=3;
var b=a=5;
console.log(a);
console.log(b);

  一般来说,等号赋值的方向是从右至左,那么上面的代码等同于下面这段代码,那么我们就用下面这段代码来解释上面的代码:

    var a=3;  //全局变量a被赋值为3
var a=5;  //此时a被重新赋值为5
var b=a;  //将a的值赋给全局变量b
  console.log(a);//a最终的值就是第二次被赋的值:5
  console.log(b);//按照代码执行顺序b的值也是:5

  上面的小案例用来抛砖引玉,现在我们来分析这个经典案例:

var a = {n: 1};//a第一次被赋值,是一个引用类型值,请记得变量赋值为引用类型值的时候,通过变量改变这个对象的时候,对象本身也发生了变化
var b = a;//b被赋值为a,因此b就是对象{n:1}
a.x = a = {n: 2};
//这个赋值与之前的简单案例有所不同,a.x指的是给a添加一个x属性,在js的运算中“.”和"="运算符同时出现,会先执行"."运算
//因此,赋值顺序被改变了,是先给a.x赋值,再给a赋值
//就是先执行:a.x={n:2},注意这里a并未改变,是给a的x属性赋值为{n:2},a还是{n:1}
//再回到我代码中的第一句话,这个赋值行为,改变了{n:1}这个对象,即给它增加了名为x的属性
//再执行a={n:2},这是变量a不再是对象{n:1},而被重新赋值为一个新的对象{n:2}; console.log(a);//自然此时a是对象{n:2}
console.log(b);//a的二次赋值,并没有影响b,b还是对象{n:1},但是由于a在重新赋值之前,给{n:1}这个对象,增加了一个x属性,因此,这时的b已经有了x属性
console.log(a.x);//{n:2}对象没有x属性,所以结果是undefined
console.log(b.x);//综上所述,这个结果是{n:2}   

  不知道您理解了吗?为了照顾初学者我用了最简单易懂甚至有些啰嗦的话来解释我对这个案例的认识,欢迎有识之士点评和交流!

 

最新文章

  1. [翻译]AKKA笔记 - DEATHWATCH -7
  2. 小型移动 webApp Demo 知识点整理
  3. 学习ES6--data2
  4. ASP.NET MVC another entity of the same type already has the same primary key value
  5. CAS原理全面分析
  6. ARM Mysql c 通信
  7. Make Ubuntu 14.04 Fullscreen and virtualbox
  8. Android:Service的非绑定式的创建和生命周期
  9. 移动端网页JS框架-手机触摸事件框架,日历框架带滑动效果
  10. 转:Selenium借助AutoIt识别上传(下载)详解
  11. alpha冲刺第五天
  12. leetcode刷题笔记231 2的幂
  13. .net 模糊匹配路径
  14. Linux机器学习软件配置
  15. Proxy代理模式(结构型)
  16. python 实现快排序
  17. toString() 数组转字符串
  18. 转---CentOS安装Oracle数据库详细介绍及常见问题汇总
  19. .yaml 文件格式简介
  20. iOS自学-混合编程

热门文章

  1. CCNP第一课:默认路由(路由黑洞,路由终结)
  2. 阿里云 Centos7.3安装mysql5.7.18 rpm安装
  3. JavaSE教程-03Java中分支语句与四种进制转换-思维导图
  4. MQL语句大全
  5. JParticles 2.0 发布,打造炫酷的粒子特效
  6. IIC协议学习笔记
  7. Mac OS中使用VScode配置C语言开发环境
  8. CSS3学习系列之选择器(三)
  9. go的基本概念
  10. CSS3的使用方法解析