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 相关文章推荐
js 编写规范
Mar 03 Javascript
JQuery从头学起第二讲
Jul 04 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
jQuery Dialog 取消右上角删除按钮事件
Sep 07 Javascript
Bootstrap CDN和本地化环境搭建
Oct 26 Javascript
ajax分页效果(bootstrap模态框)
Jan 23 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
Feb 27 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 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提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
PHP数据过滤的方法
2013/10/30 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python 实现端口扫描工具
2020/12/18 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
八年级数学教学反思
2014/01/31 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
文秘个人求职信范文
2014/04/22 职场文书
青春奉献演讲稿
2014/05/08 职场文书
激励口号大全
2014/06/17 职场文书
道士塔读书笔记
2015/06/30 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL