关于js的连续赋值

  首先,来看一个经典的案例:

<script>
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
alert(a.x);
alert(b.x);
</script>
 答案是什么呢?

  首先,js中规定求值顺序是从左到右的,这个问题很容易忽略。什么意思呢,a.x = a = {n: 2},这句代码应该怎样理解呢?等价于a.x = (a = {n: 2}),在js中,类似的连续赋值是从左到右进行的,也就是说先对a.x进行赋值,再对a进行赋值。可能很难讲清楚,这里结合js中引用类型和引用类型的赋值,请看下面的注释分析:

<script>
var a = {n: 1}//引用类型的赋值,没有问题
var b = a;//这句代码后,a和b都共同指向{n:1}这个内存中对象,所以a和b的改变(这里的改变不包含对a和b重新赋值),都会影响到{n:1},也就是说,a和b会互相影响,当然不包括对a和b重新赋值
a.x = a = {n: 2}//ok,这句话很重要,这个地方表面上看起来有些矛盾,其真实意思是,由于js中连续赋值是从左到右的,所以先将{n:2}赋给a.x,此时a和b所共同指向的对象已经变成了{n:1,x:{n:2}},ok然后呢,将{n:2}赋给a,所以,这句之后的结果就是:b依然指向以前的对象,而这个对象已经变成{n:1,x:{n:2}},而a由于赋值已经和以前的对象脱离了关系此时的a是{n:2}。
alert(a.x);//所以a.x是undefined
alert(b.x);//b.x是{n:2},所以alert的结果是:[object object]
</script>

 当然你也可以alert(b.x.n)试试,结果是2

时间: 2024-08-04 04:58:35

关于js的连续赋值的相关文章

JS基础-连续赋值

问题 var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x); 先不说答案,可能有些人已经答错了~ 错误的答案 这多简单!JS赋值运算右结合!那就分开算呗! a = {n: 2} a.x = a 然后错误的答案就这么产生了,a.x = {n: 2} 正解 其实这道题看似简单但还是有一些绕,我依稀记得高中数学老师那句经典的口头禅!遇到难题:画图啊!好吧,这句话可能我会受用一辈子,同时也送给看这篇

JS的连等赋值

文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最近一次出现了bug发现JS里的连等赋值操作的特色(坑). 网上搜索一番发现一个非常好的连等赋值的( 来源1 , 来源2 )例子: var a = {n:1}; a.x = a = {n:2}; console.log(a.x); // 输出? 答案是: console.log(a.x); // undefined 答案 不知道各位有没有答对,至少我是答错了. 遂借此机会好好看看JS连等赋值是怎么回事 赋

js中变量的连续赋值

下面就是这个经典案例: 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); 一般来说,等号赋值的方向是从右至左,那么上面的代码等同于下面这段代码,那么我们就用下面这

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连续赋值、指针

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)

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

JS变量定义时连续赋值的坑!

在定义变量时,可以将值相同的变量采用连续赋值的方式,如下代码: var a = b = c = ''; 其实这里面有一个很大很大的坑,以代码说明问题: <script language="javascript"> function test(){ var i = 0; _test(); function _test(){ if(++i>2) return; var a = b = ''; // 这里连续赋值 for(var j=0; j<=2; j++){ b

值得深思的连续赋值--赋值运算符运算顺序

最近在看到以前前辈留下的文章,对于连续赋值( var a={n:1}; a.x=a={n:2}) )这个知识点,一开始也搞不清楚,但是最终还是说服了自己,谈谈自己的心得.以下代码能回答正确的可以忽略本文. 1 var a={n:1}; 2 var b=a; 3 a.x = a = {n: 2}; 4 console.log(a.x); //? 5 console.log(b.x);//? 正确答案是: a.x= undefined; b.x= {n: 2}; 疑惑:为什么a.x与b.x不相等呢?