年前写了一篇博客, 立了一个 flag 说是以后一个星期写一篇博客, 但被年前的 997 和过年给耽误了, 算了一下一共欠了四篇博客, 后续会补上
从 18 年到这篇博客之前都是在简书上写, 当然写的都是一些浅显一点的东西, 也获得了几十个粉丝和不少赞 (惭愧), 写的都是一些工具的使用, 经过了一年的磨练决定以后写一点稍微深入一点的东西, 或者是更原理一些的东西, 望共勉
昨天水群的时候看到有人发了一道很有意思的面试题, 看起来简单, 但是答错的人倒是占了十之八九, 还有一些人可能是之前看过类似的题, 但是解释的也是差强人意, 所以就自己研究了一番
题目是这样的
- var obj = {n:1}
- var newObj = obj
- obj.m = obj = {n:2}
- console.log(obj)
- console.log(newObj)
题目就这么长, 答案是 obj = {n: 2}, newObj = {n: 1, m: {n:2}}
小伙伴们答对了吗?
其实最主要的就是那段连等赋值的代码, 在分析这段代码之前我们先看一个简单的连等代码
- let obj;
- let obj1 = obj = {
- name: 'zhangsan'
- }
思考一下这个赋值操作时怎么进行的
是这样的???
拆分 1
- let obj1 = {name: 'zhangsan']
- obj = {name: 'zhangsan'}
还是这样的?
拆分 2
- obj = {
- name: 'zhangsan'
- }
- let obj1 = obj
上面两段代码的拆分, 第一个是两个对象分别指向不同的内存地址, 第二个是指向同一个内存地址
那我们来验证一下, 看修改其中一个的值另一个会不会改变
- let obj;
- let obj1 = obj = {
- name: 'zhangsan'
- }
- // 测试改值
- obj.name = 'lisi'
- console.log(obj1.name) // 'lisi'
看来好像是指向同一块地址的, 难道是拆分 2 这样的???
- var obj = {n:1}
- var newObj = obj
- obj = {n:2}
- obj.m = obj
- console.log(obj) //{n:2,m:{n:2,m: {...}}}
- console.log(newObj) //{n: 1}
- var obj = {n:1}
- var newObj = obj
- obj.m = obj = {n:2}
- // 改变 n 的值
- obj.n = 100
- console.log(obj) //{n: 100}
- console.log(newObj) //{n: 1,m: {n: 100}}
来源: https://juejin.im/post/5c6e48865188250f1c358eab