资讯专栏INFORMATION COLUMN

连续赋值(从堆栈角度解析) a.x = a = {n:2}

canger / 1062人阅读

摘要:连续赋值今天看到一个面试题,一直想把这个题目解析更加直观化,就跟看小人书一样,看图就能明白其中的原理,所以用做了几张图。

连续赋值

今天看到一个面试题,一直想把这个题目解析更加直观化,就跟看小人书一样,看图就能明白其中的原理,所以用PPT做了几张图。

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

这块最难理解的就是这块

a.x = a = {n: 2}

接下来我们从以下几点分析以下:

运算符优先级;

`我们知道运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。`
赋值运算顺序是从右往左的,不过由于“.”是优先级最高的运算符,所以这行代码先“计算”了a.x;

优先级 运算类型 关联性 运算符
19 成员访问 从左到右 .
3 赋值 从右到左 … = …

链接: 运算符优先级

堆栈图来看怎么赋值操作的;

var a={n:1};  a指向了堆内存中的对象{n:1},  var b=a; a赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”) ,而不是堆内存中的对象。

a.x = a = {n: 2} ;前面说了“.”的优先级大于赋值运算符的优先级,所以先来看a.x;a.x实际上是未定义的;

再来看赋值运算符的从右向左解析;a = {n : 2},a被从新赋值,指向了一个新对象,而此时a.x已经先行执行完,其实指是{ n:1,x: undefined } 这个对象,接下来看左边的等号,这个对象的x值 = 等号右边计算的结果(a={n:2},所以此时b的值通过箭头可以看出等于{n:1,x:{n:2}},a的值指向新对象{n:2}

以上如有出入,请多指正~~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109228.html

相关文章

  • js中的值类型、引用类型、堆、栈、函数参数传递方式、连续赋值等概念的学习

    摘要:值类型基本类型和栈内存值类型也称为原始数据或原始值这类值存储在栈内存中基本类型的值不可以修改。目前中的基本类型一共有六种。堆的使用规则当创建数组时,就会在堆内存中创建一个数组对象,并且在栈内存中创建一个对数组的引用。 值类型(基本类型)和栈内存 值类型也称为原始数据或原始值(primitive value).这类值存储在栈(stack)内存中, 基本类型的值不可以修改。每当我们定义一个...

    hizengzeng 评论0 收藏0
  • JS基础-连续赋值

    摘要:引子今天同事聊天群里发现了一道面试题基础,但答案基本没有几个能答对并且理解的很透彻的。但是此时这个内存区并没有被回收因为变量的指针依然指向它。并且因为之前就声明了属性所以该内存区增加了属性。那么属性指向哪儿呢它的返回值就是的内存区。 引子 今天同事聊天群里发现了一道面试题(js基础),但答案基本没有几个能答对并且理解的很透彻的。 问题 var a = {n: 1}; var b = ...

    Youngdze 评论0 收藏0
  • 【进阶1-4期】JavaScript深入之带你走进内存机制

    摘要:引擎对堆内存中的对象进行分代管理新生代存活周期较短的对象,如临时变量字符串等。内存泄漏对于持续运行的服务进程,必须及时释放不再用到的内存。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第4天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划...

    不知名网友 评论0 收藏0
  • 【半月刊 4】前端高频面试题及答案汇总

    摘要:引言半月刊第四期来啦,这段时间新增了道高频面试题,今天就把最近半月汇总的面试题和部分答案发给大家,帮助大家查漏补缺,欢迎加群互相学习。更多更全的面试题和答案汇总在下面的项目中,点击查看。引言 半月刊第四期来啦,这段时间 Daily-Interview-Question 新增了 14 道高频面试题,今天就把最近半月汇总的面试题和部分答案发给大家,帮助大家查漏补缺,欢迎 加群 互相学习。 更多更...

    hankkin 评论0 收藏0
  • 由ES规范学JavaScript(二):深入理解“连等赋值”问题

    摘要:有这样一个热门问题其实这个问题很好理解,关键要弄清下面两个知识点引擎对赋值表达式的处理过程赋值运算的右结合性一赋值表达式形如的表达式称为赋值表达式。赋值表达式是右结合的。 有这样一个热门问题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...

    JasonZhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<