其实事情是这样的,最近看到不少朋友讨论一道据说不知道哪儿的笔试题目,题目如下:

var a = {n:1};
var b = a;
a.x = a = {n:2};

请写出a.x的值。

当然通过运行,大家很快找到答案undefined。

说实话这道题似乎难住了不少人,在问题还没解决时,突然有人喊了一句a = a.x = {n:2}结果也是一样耶,此时大家都是一脸懵逼的状态。

这个其实很好理解,a.x = a = {n:2}这个包括两个过程,一是“解析”(其实是“.”操作符的优先级要高于赋值),然后赋值;

用图表示如下:

1)开始时

2)解析时

 

3)赋值时

 

看到这里大家是不是明白了,什么没看懂?那你的疑问是不是还停留在“解析”时的状态?其实js对象添加属性包括两个过程,"解析"和"赋值",上面也说了,这个“解析”呢,其实就是‘.’操作符的优先级要高于赋值,这两个过程的执行方向刚好相反,“解析”从左到右进行,赋值则从右到左,而且“解析”的过程在赋值之前,也就是说,如var obj = {};obj.name='zhangsan';这个过程其实是先“解析”,为对象{}添加一个值为undefined的属性name,即obj.name-->{name: undefined};然后进行赋值,即将'zhangsan'赋值给其name属性,最终对象obj指向{name:zhangsan}。

到目前为止,加上上面三幅图,大家对这个问题还有疑问吗?

注:本文仅作为学习过程中的简单记录和分享,如有问题请提出并指教,共同进步。

http://www.jianshu.com/p/a4e9f81da082

最新文章

  1. MySQL插入语句解析
  2. JTMz换路径导致MySQL服务不能启动的问题
  3. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
  4. Spring事务讲解示例(转)
  5. perl版 Webshell存活检测
  6. 四张图揭秘中国AI人才现状
  7. ubunt tftp服务器搭建
  8. 关于在Editplus中设置内容提示比如syso的快捷输出的方法
  9. Sharepoint2013部署ADFS 报new-sptrustedIdentityTokenIssuer:the trust provider certificate already exist
  10. Windows Linux的cmd命令查询指定端口占用的进程并关闭
  11. Jquery 组 tbale表格隔行变色
  12. 浅谈C语言内存管理、内存泄露、堆栈
  13. 【CSS3】响应式布局
  14. 利用Tensorflow实现卷积神经网络模型
  15. nginx FastCGI错误Primary script unknown解决办法
  16. 02: pycharm远程linux开发和调试代码
  17. Xcode - 升级后模拟器无法响应电脑键盘
  18. Thrift0.11.0基于Intellij IDEA的简单的例子
  19. 51Nod 1069:Nim游戏(尼姆博弈)
  20. SDWebImage从缓存中获取图片

热门文章

  1. 图像手工画效果【QT+OpenCV】
  2. angularjs 表单校验
  3. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否
  4. matlab subplot(figure)如何设置使得图像最终显示出来不一样大小
  5. rest_framework(解析器 上)
  6. 5.不用拷贝的对象可以用ref
  7. centos6.9安装virtualenv并配置python2.7环境
  8. NodeJS学习笔记 (28)流操作-stream(ok)
  9. 用树链剖分来写LCA
  10. 使用GitHub+Hexo建立个人网站,并绑定自己的域名(Ubuntu环境下)