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 02 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
jquery分割字符串的方法
Jun 24 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
js实现功能比较全面的全选和多选
Mar 02 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
Apr 13 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
vue.js 实现点击展开收起动画效果
Jul 07 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 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
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
常用js脚本
2006/12/03 Javascript
很可爱的输入框
2008/08/03 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
请解释流与文件有什么不同
2016/07/29 面试题
团员学习总结的自我评价范文
2013/10/14 职场文书
幼教简历自我评价
2014/01/28 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
思想道德自我评价2015
2015/03/09 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
机器人总动员观后感
2015/06/09 职场文书
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
图神经网络GNN算法
2022/05/11 Python