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出现了多次之后,可以看成递归

时间: 2024-12-21 10:33:08

js连续赋值、指针的相关文章

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

js hasChildNodes()指针对元素节点子节点多个的话 true

1 <select multiple size="2"> 2 <option value="bj">北京</option> 3 <option value="sh">上海</option> 4 <option value="gz">广州</option> 5 </select> 6 <script type="tex

日常之学习CSS3变形和js函数指针

1,transform变形属性,包括rotate(xxdeg)旋转,translate(x轴px,y轴px)移动,scale(0.5,2)变形(x轴缩小0.5倍,y轴放大2倍),skew(x轴deg,y轴deg)拉伸, 拉伸透视图: 2,transtion过渡属性,保证变形平滑进行. 函数指针: function fun(){ return 5}var a=funvar b=fun() JS中我们把以上代码加粗的部分叫做函数,函数是一种叫做function引用类型的实例,因此函数是一个对象.对象

js this指针

在Javascript里面,this指针代表的是执行当前代码的对象的所有者.并且需要记住的是在js中"一切皆是对象" 也可以显示改变this指针 1.使用new操作符的时候会返回一个新的对象并且将this指针指向被赋值的变量 2.使用apply或者call var name = 'qzd' function sayHi() { console.log(this.name) } var person = {} person.name = 'querry' person.hi = sayH

js 连续赋值

无意中网上发现的这个问题,预想的结果和真实的结果大相径庭. var a={n:1} var b=a; a.x=a={n:2} console.log(a.x); console.log(b.x); undefined Object{n:2} 要是拆开来看,结果就是我所想的那样 var a={n:1} var b=a; a={n:2}: a.x={n:2} console.log(a.x);//Object{n:2} console.log(b.x);//undefined 分析: a.x=a={

JS连续赋值与求值顺序

以下代码输出什么? 为什么? var a = {n:1}; var b = a; a = {n:2}; a.x = a ; console.log(a.x); console.log(b.x); var a = {n: 1} var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x) 第一个问题: a.x ---> {n:2,x:a}; b.x ---> undefined; 解答:a的值很清晰了,a第二次赋值以后变成了{n:

js连续赋值

连续赋值问题 var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x); console.log(b.x); 结果:undefined   {n:2} 原因: a.x = a = {n:2}; a 被重写, a.x也被重写 此时 a被重新赋值为{n:2}    a.x 还是{n:1} 即: a = {n:2};   a.x = {n:2}; 等价于 :a.x = (a = {n:2}); 但是只执行了第一步,所以a.x为undefin

云存储上传控件更新日志-Xproer.HttpUploader7

官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-uploader7/index.asp 在线演示:http://www.ncmem.com/products/http-uploader6/index.html 产品介绍:http://www.cnblogs.com/xproer/p/4744468.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/10/26

连续赋值和内存指针的问题解析(a.x=b={n:2})

前几天偶然看到了一个这样的题: 1 <script> 2 var a={n:1}; 3 var b=a; 4 a.x=a={n:2};//关键代码5 console.log(a.x);//undefined 6 console.log(b.x);//[object Object] 7 </script> 这个题代码不多,不过考察的知识点却非常不错.我们知道内存空间分为栈内存和堆内存.栈内存用来存放供js代码来执行的环境,所以为了保证性能减少内存占用,我们一般把占用空间较小的类似于基