javascript 连续赋值(连等运算)问题研究
前几天看到一个javascript 连续赋值的问题,运行了一下,结果出乎意料,发现这里的水真的有点深啊,连续赋值的底层机制,没有一本前端书籍有详细介绍的,自己做实验研究了一下,先来看结果:
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log("a.x:",a.x); //undefined
console.log("b.x:",b.x) //{n:2}
运行结果:
a.x: undefined
b.x: Object {n: 2}
a.x居然是undefined,没搞错吧,根据我印象中的连续赋值原理,执行顺序是从右向左执行,a.x = a = {n: 2} ,相当于依次执行了(1) a={n:2}, (2) a.x=a 这两行代码,那么a.x应该是递归引用到a本身的,形成一棵子节点无限引用自身的子树,但是我猜中了开头却没猜中结局,我的世界观开始崩塌,先来验证一下连续赋值是否是从右向左的吧。
var a={};
Object.defineProperty(a,"x",{
get:function(){console.log("get a.x");return this._x;},
set:function(v){console.log("set a.x:"+v);this._x=v;return this._x}
})
var b={};
Object.defineProperty(b,"x",{
get:function(){console.log("get b.x");return this._x;},
set:function(v){console.log("set b.x:"+v);this._x=v;return this._x}
})
a.x=b.x="hello,world";
运行结果是
set b.x:hello,world
set a.x:hello,world
说明了两件事:
1)赋值顺序是从右向左
2)执行了b.x="hello,world",a.x="hello,world", a.x的值并没有从b.x获取,因为get属性存取器并没有执行。
那么问题来了,a.x = a = {n: 2} ,等价的运行结果是a={n:2}, a.x={n:2} ,a.x应该有值才对,现在运行的结果是b有值,说明这两行代码虽然是有先后执行顺序,但实际上是相互隔离的。当执行a.x={n:2} 时,a的引用仍然指向旧的对象(即变量b指向的对象),所以b.x有值了。
javascript 连续赋值(连等运算)问题研究的更多相关文章
- javascript的变态位运算
javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...
- 奇特的JavaScript连续赋值运算
一.引子: }; a.x = a = {n:}; alert(a.x); // --> undefined 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式.这个连续赋值表达式在 ...
- (转)深入理解javascript连续赋值表达式
引入 今天逛园子的时候看到一道javascript面试题,是关于连续赋值的,正好最近读jQuery源码经常看到这种连续赋值的表达式,所以很感兴趣. 废话不多说,来看题: var a = {n: 1} ...
- javascript中的浮点数运算
解释一下下面代码的输出 console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 == 0.3); //false Jav ...
- javascript 连续赋值(转载)
先看一个例子 ● var a = {n:1}; ● var b = a; ● a.x = a = {n:2}; ● console.log("a.x: " + a.x); // ...
- JavaScript知识点---->运算规则与运算(逻辑、位)
*在js中不同类型之间的运算,所得到结果的类型也会有所变化: string + number = string string + boolean = string string + undefiend ...
- javascript继承(一)—类的属性研究
本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是 ...
- JavaScript中的加法运算
<head runat="server"> <title>JavaScript实现加法计算器</title> <script type=& ...
- JavaScript定时机制setTimeout与setInterval研究
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( ...
随机推荐
- 前端学习笔记系列一:2 Vue的单文件组件
(1)非单文件vue组件和单文件vue组件的一般写法 一个完整的vue组件会包括三个部分:一是template模板部分,二是js程序逻辑部分,三是css样式部分.每个组件都有属于自己的模板,js和样式 ...
- Android程序的入口点是什么,不是Main()吗
很多初入Android开发的网页可能不知道Android程序的入口点是什么,不是main()吗,当然我相信回复onCreate的在字面上不算错,但是你们想的是Activity中的onCreate 方法 ...
- NO17 第二关考试: 返回上次目录和ls -lrt倒序看文件--删除7天前的日志--查看日志更新--记录行号
第二题:不用cd /ildboy命令如何回到上一次的目录: 假如当前目录是: [root@localhost oldboy]# pwd/oldboy现在因为需要进入到了/tmp目录下进行操作,执行的命 ...
- 从LG绝不放弃智能手机业务看后者到底有多重要?
近年来,全球手机市场放缓已经是不争的事实.与此同时,手机行业集中趋势明显,几家巨头掌握着大部分市场,占据着垄断的市场位置.但就是在这样的态势下,很多手机部门明显已经成为累赘的企业,却依然不想放弃智能手 ...
- docker学习笔记-02:docker常用命令
一.帮助命令: 1.查看版本:docker version 2.查看信息:docker info 3.查看帮助信息:docker --help 二.镜像命令: (一).查看已有镜像: 1.命令:doc ...
- SpringBoot#ConfigurationProperties注解相关的一些知识
用途:ConfigurationProperties注解,用于在spring环境定义bean的时候.通过这个注解,把配置文件中的相关属性注入到实例化的bean中. 原理:spring中bean的生命周 ...
- 我用Python帮朋友做了张猪肉数据分析图,结果。。。
却发现他是这么拿我当兄弟的 事情的经过是这样的: 我开开心心的去一家烧饼店吃饭 . 抬头一看,二师兄又涨价了 叹了口气,再这么下去真的要吃不起夹肉的烧饼了 点了两个烧饼一碗馄饨 快吃完的时候, ...
- 065、Java面向对象之定义一个Book类,在主类中使用Book类
01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...
- WordPress 更新中断故障
WordPress 更新中断故障 WordPress更新中断后显示:Briefly unavailable for scheduled maintenance. Check back in a min ...
- 又一个无效的列类型错误Error setting null for parameter #7 with JdbcType NULL . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLExcept
在更新数据时候出现的错误 更新代码如下: <update id="modify" parameterType="Standard"> update ...