js中变量的连续赋值(实例讲解)


Posted in Javascript onJuly 08, 2017

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

下面就是这个经典案例:

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}

以上这篇js中变量的连续赋值(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 高效运行代码分析
Mar 18 Javascript
JQuery 技巧和窍门整理(8个)
Apr 22 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
JS正则验证邮箱的格式详细介绍
Nov 19 Javascript
浅谈几种常用的JS类定义方法
Jun 08 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
JavaScript原生实现观察者模式的示例
Dec 15 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
Sep 05 jQuery
如何利用node转发请求详解
Sep 17 Javascript
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
Jun 29 Javascript
理解 javascript 中的函数表达式与函数声明
Jul 07 #Javascript
彻底解决 webpack 打包文件体积过大问题
Jul 07 #Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
Jul 07 #Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 #Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
Jul 07 #Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 #Javascript
JS实现搜索关键词的智能提示功能
Jul 07 #Javascript
You might like
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
很可爱的输入框
2008/08/03 Javascript
javascript 函数调用规则
2009/08/26 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python解析基于xml格式的日志文件
2017/02/25 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python实现KNN近邻算法
2020/12/30 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
出纳的岗位职责
2013/11/09 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
在职证明书模板
2015/06/15 职场文书
Springboot中如何自动转JSON输出
2022/06/16 Java/Android