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连续赋值、指针的更多相关文章

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

    1,transform变形属性,包括rotate(xxdeg)旋转,translate(x轴px,y轴px)移动,scale(0.5,2)变形(x轴缩小0.5倍,y轴放大2倍),skew(x轴deg, ...

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

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

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

    <script> var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined conso ...

  4. js 连续赋值

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

  5. 一道JS 连续赋值运算的问题

    原文链接:https://www.cnblogs.com/joesbell/p/6229423.html <script> var a = {n:1}; var b = a; a.x = ...

  6. js 连续赋值。。理解不了,先占坑

    http://www.cnblogs.com/xxcanghai/p/4998076.html

  7. 关于一个js连续赋值问题之我见(词略穷,见谅)

    前几天在搜索面试题时发现了这么一段代码,执行完后感觉完全不与所想的一样 var a = { n : 1 }; var b = a; a.x = a = {n : 2}; console.log(a.x ...

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

    <select multiple size="2"> <option value="bj">北京</option> < ...

  9. MXBridge - 插件式JS与OC交互框架

    概述 MXBridge,提供一个插件式的JavaScript与Objective-C交互的框架,通过JavaScriptCore实现,插件式扩展Obejctive-C接口以供JavaScript调用. ...

随机推荐

  1. Windows 查看端口占用

    查看 Windows 端口占用情况 在 Windows 命令行窗口下执行一下命令 查看所有端口占用情况 netstat -ano 查看特定端口的占用情况 netstat -aon|findstr &q ...

  2. Java Web 开发环境快速搭建

    Java Web 开发环境快速搭建 在因某种原因更换开发设备后,可依据此文快速搭建开发环境,恢复工作环境. Java开发环境: Windows 10 (64-bit) Oralce JDK Eclip ...

  3. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)

    Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...

  4. PHP学习过程_Symfony_(2)

    今天正式学习Symfony;首先推荐一篇文章"十分钟学习Symfony"(这是我们老大写的,由于那些搞seo的家伙的粘贴复制也不写出处,老大干脆把代码库给清理了,不过幸好我提前fo ...

  5. magento数据添加

    1.第一种方法是一个字段一个字段地添加! $record = Mage::getModel('warehouse/record');      $record->addData($postDat ...

  6. visual studio2013 改变匹配括号的颜色

    改变匹配括号的颜色实现如下效果

  7. dubbo 分布式架构学习视频链接

    http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd 书籍 大型分布式网站架构设计与实践 http://item.jd. ...

  8. putty完全使用手册--多窗口---git提交---连接数据库--自动日志显示

    01 putty dev 192.168.3.38 02 cd /home/gongfu/tripb/cranedev02.1 git status git add git commit git pu ...

  9. xcb编译

    sed -i "s/pthread-stubs//" configure && ./configure $XORG_CONFIG \ --enable-xinput ...

  10. Jbpm工作流表补数记录

    一: 历史数据表 11.  JBPM4_HIST_ACTINST 流程活动(节点)实例表 存放Activity Instance的历史记录 12.  JBPM4_HIST_DETAIL  流程历史详细 ...