题目:

var a={n:1};
var b=a;
a.x =a ={n:2};
console.log(a.x);
console.log(b.x);

答案

alert(a.x);// --> undefined
alert(b.x);// --> {n:2}

讲解
估计大部分人对a.x=undefined存在疑问。
这里将原则总结为一句话:
代码的执行顺序,先从左到右扫描变量,再从右到左进行赋值

扫描阶段
在a.x = a = {n:2}中,首先扫描到a.x,a.x不存在,所以默认指向null,即a.x=>null。然后扫描到a,a已经存在,所以仍然指向原来的对象,而此时a的指向仍然为{n:1},即a=>{n:1}。

赋值阶段
在a.x = a = {n:2}中,首先赋值最右边。 a = {n:2},让a指向了{n:2},即a=>{n:2}。继续赋值a.x,(重点)此时的a.x中,a的指向没有改变,可以理解为a.x中的a保留了原来的镜像。也就是原对象变为{n:1,x:{n:2}},而此时只有b指向原对象。

因此最终输出的时候
console.log(a.x) 此时a.x中的a已经彻底指向了新对象。输出的是新对象中的x属性值。而老对象中的x属性也已经不再叫做a.x了。至于叫做什么不得而知。
console.log(b.x) 输出的是老对象中x属性值。
老对象为 {n:1,x:{n:2}}
新对象为{n:2}
因此a.x自然取不到值,为undefined。
如果我们再次赋值 a.x = 3;
则输出结果为 console.log(a.x) // {n:2,x:3}。表明原来的a.x已经被删除,在新的a对象中新建了属性x。

其实核心的原理就是 “.”优先级高于"=",所以先保留了指针,后进行了赋值,然后进行了gc,发现a的指向已经改变,删除了原来的指针a.x。

最后一图胜千言

来源:https://www.jianshu.com/p/d0d8cb54e664

经典面试题之赋值操作相关推荐

  1. 经典面试题|ConcurrentHashMap 读操作为什么不需要加锁?

    作者 | 上帝爱吃苹果 来源 | cnblogs.com/keeya/p/9632958.html 我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的g ...

  2. [ZZ]知名互联网公司Python的16道经典面试题及答案

    知名互联网公司Python的16道经典面试题及答案 https://mp.weixin.qq.com/s/To0kYQk6ivYL1Lr8aGlEUw 知名互联网公司Python的16道经典面试题及答 ...

  3. 【Linux 经典面试题】

    [Linux  经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...

  4. Java经典面试题整理及答案详解(五)

    Java经典面试题第五弹来啦!本节面试题主要是针对Java初级基础提问,看看你还记得多少? 1.String str="hello",这个字符串对象在栈内存中明明有一个引用(str ...

  5. C++经典面试题(最全,面中率最高)

    C++经典面试题(最全,面中率最高) 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与fre ...

  6. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  7. Java经典面试题一

    转载自  Java经典面试题一 题目一 面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1.抽象: 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽 ...

  8. linux(1):Linux经典面试题

    Linux经典面试题,看看你会几题? 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统 ...

  9. 21道Python经典面试题,助你offer拿到手软!

    导读:又到"金九银十"招聘黄金季,21道Python经典面试题助你offer拿到手软,收好不谢! 01 Python如何实现单例模式? Python有两种方式可以实现单例模式,下面 ...

  10. java 1.8有没有jshell_收藏了800道Java后端经典面试题,分享给大家,希望你找到自己理想的Offer呀~...

    前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...

最新文章

  1. Android基础——框架模式MVC在安卓中的实践
  2. 线上redis一般安在linux_redis的zset有多牛?请把耳朵递过来
  3. aws创建html网页,AWS: 在AWS上创建一个网站,综合运用(Lambda + Api Gateway + Dynamodb + S3)...
  4. javascript --- 非交互、交互、协作、任务
  5. c语言编程算法精选,c语言经典程序算法【DOC精选】.doc
  6. 网页制作表单代码java_网页制作的40个经典代码
  7. tigerVNC的简单使用教程(CentOS 自带VNC包的远程桌面连接)
  8. Python实现对nginx日志access.log统计
  9. 什么是区块链? 区块链的入门教程~
  10. java word 复制_Java 复制Word文档
  11. 2009年25大最新网络游戏排行榜
  12. 6个最常用的Word论文排版技巧
  13. 新品开源又融资,长亭科技“脱胎而成”!
  14. Python文件操作-文本文件、二进制文件、csv文件的读取写入、OS、shutil、CSV模块、常用字符编码
  15. 【转】如何从计算视角研究网络传播影响力最大化问题?
  16. RocketMQ学习笔记:基础知识和安装启动
  17. 使用FFmpeg命令处理音视频
  18. 抓紧收藏,教你如何轻松快速度过冷启动时期?短视频新手必看
  19. php翻译成中文版,php 翻译函数,可以将中文汉字转换为E文
  20. SAP MM模块简单介绍

热门文章

  1. python-if判断
  2. javascript:控制一个元素高度始终等于浏览器高度
  3. vue-自定义组件传
  4. C# DataTable.Select() 筛选数据
  5. 80X86寄存器介绍
  6. UiAutomator2.0 和1.x 的区别
  7. 如何摆脱工具类【转载】
  8. android开发学习笔记系列(1)-android起航
  9. 80后智能科技公司诚聘业务人员
  10. javascript里new构造函数返回的值