js连续赋值、指针
jq的源码中有很多连续赋值,类似这样的:
var a = {n:1};
var b = a; // 持有a,以回查
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> [object Object]
网上有很多解释了,这里我做一下记录而已,化繁为简,比较容易理解的过程是这样的:
给{n:1},{n:2}分别起名个实际持有这两个内存地址的虚拟对象名字,比如:obj1 -》{n:1},obj2-》{n:2}
1)var a = {n:1}; //定义了一个指针a指向内存中的{n:1},即a = obj1->{n:1}
2)var b = a;//定义了b也指向了内存中的{n:1},即b = obj1->{n:1}
3)a.x = {n:2};//本质是obj1.x = {n:2},即改变的是a和b所指向的对象
4)a = {n:2};//a的指针指向了obj2,是一个新的对象
现在的结果是:
a:a = obj2 = {n:2};
b:b = obj1 = {
n:1,
x:{n:2}
}
好了,下面说说实际过程,来自于网络(http://snandy.iteye.com/blog/785445?page=2#comments)评论中写的很清楚了:
简单几点摘抄:
1、求值顺序:从左到右
2、运算符的结合性:右结合,但也是从左到右求值
主要解读 a.x = a = {n:2}; 这句的执行顺序
按照上面两条的规则来看:
1)求值从左到右,那就是先给a.x赋值即a.x = expression
2)解读一下此时的a.x指向谁,此时a指向obj1-》{n:1},即给obj1.x赋值变成了obj1.x = expression
3)左边解析完了,进入“=”的右边,是一个表达式(a={n:2}),这里为啥不是一个光秃秃的a呢,即为啥不是这样的顺序a.x = a,主要根据第二条,右结合性,
会把a = {n:2}看成一个整体解析(这时候a的指针指向了obj2),返回的是{n:2}
4)赋值,obj1.x = obj2 = {n:2},第3步在解析过程中已经把a的指针指向obj2了,因此a.x(obj2.x)根本没有这个属性,obj1才有
比较难理解的是第三步,明白几点:首先不是先计算右边的值(即不是先计算a = {n:2}),而是先解析左边的规则(指针)a.x,解析成obj1.x之后,才开始到右边,
这时候根据右结合性,把(a={n:2})看成一个整体,然后复制计算。我们的别扭在于一个表达中的a居然指向了不同的对象,就像评论中解释的一样a出现了多次之后,可以看成递归
js连续赋值、指针的更多相关文章
- 日常之学习CSS3变形和js函数指针
1,transform变形属性,包括rotate(xxdeg)旋转,translate(x轴px,y轴px)移动,scale(0.5,2)变形(x轴缩小0.5倍,y轴放大2倍),skew(x轴deg, ...
- js连续赋值,你理解了吗
看一道有意思的题,也许你会自信满满地写下答案,会是正确的吗? }; var b = a; a.x = a = {n: }; console.log('a',a); console.log('b',b) ...
- 从一个简单例子来理解js引用类型指针的工作方式
<script> var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined conso ...
- js 连续赋值
无意中网上发现的这个问题,预想的结果和真实的结果大相径庭. var a={n:1} var b=a; a.x=a={n:2} console.log(a.x); console.log(b.x); u ...
- 一道JS 连续赋值运算的问题
原文链接:https://www.cnblogs.com/joesbell/p/6229423.html <script> var a = {n:1}; var b = a; a.x = ...
- js 连续赋值。。理解不了,先占坑
http://www.cnblogs.com/xxcanghai/p/4998076.html
- 关于一个js连续赋值问题之我见(词略穷,见谅)
前几天在搜索面试题时发现了这么一段代码,执行完后感觉完全不与所想的一样 var a = { n : 1 }; var b = a; a.x = a = {n : 2}; console.log(a.x ...
- js hasChildNodes()指针对元素节点子节点多个的话 true
<select multiple size="2"> <option value="bj">北京</option> < ...
- MXBridge - 插件式JS与OC交互框架
概述 MXBridge,提供一个插件式的JavaScript与Objective-C交互的框架,通过JavaScriptCore实现,插件式扩展Obejctive-C接口以供JavaScript调用. ...
随机推荐
- 第一百零八节,JavaScript,内置对象,Global对象字符串编码解码,Math对象数学公式
JavaScript,内置对象,Global对象字符串编码解码,Math对象数学公式 学习要点: 1.Global对象 2.Math对象 ECMA-262对内置对象的定义是:"由ECMASc ...
- Date 和 SimpleDateFormat 类表示时间
Date now=new Date(); // 使用format()方法将日期转换为指定格式的文本 SimpleDateFormat sdf1 = new SimpleDateFormat(" ...
- 【1】Chrome - 更换主题
更换 Chrome 主题 参照:百度经验 如何在 Chrome 浏览器设置自己喜欢的皮肤,从而使得浏览器更具有个性和吸引力?下面就一步步教你实现(需要fan墙). 实现的效果如下: 第一步:启动Chr ...
- webpack - tree shaking
Tree-shaking with webpack 2 and Babel 6 babel-webpack-tree-shaking Ben Levwis
- Payoneer官网注册教程,免费申请美国银行账号
在我搞网赚项目的过程中,碰到境外收款付款的问题,起初我用Paypal贝宝,手续费高得惊人!相信做电商外贸的朋友深有体会.幸而发现了Paypal替代产品Payoneer,注册简单,手续费低,还有中文网站 ...
- chapter9_2 管道与过滤器
一个关于协同程序的经典示例就是“生产者-消费者”的问题. 一个不断产生值,一个不断消费这些值.比如: function producer() while true do local x = io.re ...
- Channel Allocation(DFS)
Channel Allocation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) ...
- ASP.NET中的Excel操作(NPOI方式)
代码准备: 一:实体准备 代码如下: /// <summary> /// 一个能添加到将要导出到指定行的实体类型规范 /// data:{int StartColIndex ? 0, in ...
- AccessToMySql数据库的导入以及java生成.exe文件
一.AccessToMySql 最近做了一个Access数据库导入MySql的小工具,期间遇到诸多问题,这里小计一下. 表名为cur_rec,共有5个字段 比较奇葩的是这个表居然是四个字段的联合主键, ...
- iOS中的触摸事件,手势识别,摇晃事件等
在iOS中,事件可以划分为以下几类: 1.触摸事件:通过触摸,手势进行触发(手指点击.缩放等) 2.运动事件:通过加速器触发(例如手机晃动) 3.远程控制事件:通过其他远程设备触发(例如耳机控制按钮) ...