资讯专栏INFORMATION COLUMN

关于连等赋值

Joyven / 1384人阅读

摘要:或者也不会改变结果为什么不是呢在中首先需要明白一点,中有种基本类型不能对其添加自定义属性。

var foo = {n:1};
var bar = foo;
foo.x = foo = {n:2}; // 或者foo = foo.x = {n:2}也不会改变结果
console.log(foo);    // {n: 2}
console.log(bar);    // {n: 1, x: {n: 2}}

为什么bar不是{n: 2,x: {n: 2}}呢?

在JS中, 首先需要明白一点,js中有5种基本类型(string/number/boolean/null/undefined), 不能对其添加自定义属性。而将对象赋值于一个变量时,其实只是让该变量的指针指向对象;
在赋值运算中, 赋值会从右向左进行,但是有一点, "." 的运算会优先赋值, 即发生如下:

1 => foo.x = {n: 2} 即指针指向的地址不变(即非重新指向新对象), 只是对指针指向的对象添加了一个属性得到: {n: 1, x: {n: 2}}
2 => foo = {n: 2} 即foo重新指向了另一个新的对象
3 => bar的指针未有改变, 仍指向已经被添加了新属性的 {n:1, x: {n: 2}}

这一点需要和非连等区分开:

var foo = {n:1};
var bar = foo;
foo = {n: 2};
foo.x = {n: 2};
console.log(foo);    // {n: 2, x: {n: 2}}
console.log(bar);    // {n: 1}

所以,最后foo = {n: 2},bar={n:1,x: {n: 2}}
顺带一提,这也就是为什么有这么一道题:

var a = {n: 1};
var b = a;

b.n = 110;
console.log(a); //{n: 110}

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

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

相关文章

  • 由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
  • Python 基础起步 (四) 变量是什么东西 ?

    摘要:变量是什么大家好,我回来啦,今天想为大家介绍里面一个神奇的东西变量。 变量是什么 Hello, 大家好,我回来啦,今天想为大家介绍Python里面一个神奇的东西:变量。其实这个东西真正要非常详细的解释的话要将好多,因为它至少包含以下几种类型: 全局变量 (在模块内、在所有函数外面、在class外面是全局变量) 局部变量 (在函数内、在class的方法内,未加self修饰就是局部变...

    tracy 评论0 收藏0
  • MobaXterm:远程终端登录软件封神选手

    摘要:复制粘贴断线重连等常见行为很容易找到,不需要教程或口口相传的暗示。参考十项全能的远程终端登录软件开源硬件佳软介绍 提到SSH、Telnet等远程终端登录,我相信很多人想到的都是PuTTY PuTTY通常用于Windows,但实际上可以多平台运行,因此不表达为Windows下的远程终端登录 PuTTY足够成熟、小巧、专注核心任务,并且对编码等常见坑的处理并不缺乏,这其实都是优点。但PuT...

    plokmju88 评论0 收藏0
  • 《你不知道的JavaScript》 (中) 阅读摘要

    摘要:这时候控制台看到的是对象的快照,然而点开看详情的话是这段代码在运行的时候,浏览器可能会认为需要把控制台延迟到后台,这种情况下,等到浏览器控制台输出对象内容时,可能已经运行,因此会在点开的时候显示,这是的异步化造成的。 本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScri...

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

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

    不知名网友 评论0 收藏0

发表评论

0条评论

Joyven

|高级讲师

TA的文章

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