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

<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

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

  1. JS变量连续赋值

    下面就是这个经典案例: var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a);console.log(b); console.log( ...

  2. JS基础-连续赋值

    重点:先声明,从左向右,声明变量分配内存,后赋值,从右向左 问题 var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); cons ...

  3. 千万不要在JS中使用连等赋值操作

    前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最近一次出现了bug发现JS里的连等赋值操作的特色(坑). 网上搜索一番发现一个非常好的连等赋值的(来 ...

  4. 【转】千万不要在JS中使用连等赋值操作

    原文链接 千万不要在JS中使用连等赋值操作   目录 前言 赋值顺序? 连续赋值能拆开写么? 后记 前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最 ...

  5. 零散的JS和node.js小知识

    JS的连续赋值和曾经出现的怪异情况 let a=1; let b=a=3; 如上的真实赋值过程 => a=1 => a=3 => b=3 => 一般来说,等号是从右向左赋值的 ...

  6. js中变量的连续赋值

    今天遇到了一个连续赋值的经典案例,网友们给出的答案也是五花八门,看起来有些繁琐,我也来说说自己的看法. 下面就是这个经典案例: var a = {n: 1}: var b = a; a.x = a = ...

  7. js连续赋值,你理解了吗

    看一道有意思的题,也许你会自信满满地写下答案,会是正确的吗? }; var b = a; a.x = a = {n: }; console.log('a',a); console.log('b',b) ...

  8. js 连续赋值

    无意中网上发现的这个问题,预想的结果和真实的结果大相径庭. var a={n:1} var b=a; a.x=a={n:2} console.log(a.x); console.log(b.x); u ...

  9. js连续赋值、指针

    jq的源码中有很多连续赋值,类似这样的: var a = {n:1}; var b = a; // 持有a,以回查 a.x = a = {n:2}; alert(a.x);// --> unde ...

随机推荐

  1. linux文件特殊属性介绍(s,s,t)

    文件的权限有rwx这3个读.写.执行的权限.但是,怎么 /tmp权限有些奇怪?还有, /usr/bin/passwd也有些奇怪,怎么回事呢? [root@linux ~]# ls -ld /tmp ; ...

  2. As3.0 类的【枚举】

    As3.0 类的枚举   “枚举”是您创建的一些自定义数据类型,用于封装一小组值.ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 En ...

  3. log4net发布时assembly引用错误的问题

    网上的通行配置: 无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句: [assembly: log4net.Config .XmlConfigurator()] ...

  4. ubuntu 设置vpn

    百度了资料 http://jingyan.baidu.com/article/fa4125aca7f1b628ad709271.html 1. 设置 VPN CONNECTION 2.configur ...

  5. photoshop 魔术橡皮擦

    魔术棒和橡皮的结合,不用解锁就能抠图

  6. launchMode传递参数注意startActivityForResult

    Activity1 到Activity2 用startActivityForResult 如果Activity2的launchMode为 singleInstance 和 singleTask 都会启 ...

  7. 一款值得推荐的shell工具

    1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...

  8. linux(视频学习)2

    第二部分(javaee的开发环境的搭建): 1. 安装jdk的过程: 安装ios的镜像文件,挂载到/mnt目录下.挂载: mount  /mnt/cdrom卸载: umount  /mnt/cdrom ...

  9. openURL in APP Extension

    var responder = self as UIResponder? while (responder != nil){ if responder!.respondsToSelector(Sele ...

  10. ubuntu服务器移植步骤

    1.安装LAMP套件 1 tasksel 2.安装FTP工具 http://www.cnblogs.com/esin/p/3483646.html 3.安装PHPMyAdmin 1)安装 1 apt- ...