连等的思考

年前写了一篇博客,立了一个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}

拆分之后输出的结果和不拆分的时候结果是不一样的

以上的测试得出这篇文章的第一个结论:

<font color='#ff0000'>连等代码是不可拆分的</font>

接下来继续分析面试题,看看这段代码到底做了什么

obj.m = obj = {n:2}

我们都知道赋值是从右向左赋值的

所以上面的代码 相当于下面的三步

<font color='#ff0000'>赋值操作之前编译器就已经读取到了变量和它的属性m,然后编译器会在作用域中查找对象是否有m属性,没有的话就会生成m属性</font>

赋值之前读取当obj还有m属性,所以把他添加到内存里面,因为需要等待右边赋值完成所以暂时指定为null

image

从右侧开始赋值,即执行obj = {n: 2}, '=' 赋值就相当于new Object()的语法糖所以新创建了一块内存空间

image

赋值到左侧的时候m的属性值指向了obj的新内存地址

image

这个时候我们在测试一下

  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}}

看来上述的三步分解是正确的

但是实际开发中还是要谨慎使用连等,避免造成不必要的麻烦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,106评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,490评论 1 45
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 2,703评论 0 73
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,323评论 0 6
  • 自从上年年底了解到数据分析和挖掘这个概念之后,今年1月底毕业前夕,让自己完全沉下心来学习Python的数据,截止到...
    Garfield_Liang阅读 3,005评论 5 6