文档章节

js对象等号赋值的bug

o
 osc_wws45aot
发布于 2019/08/20 10:15
字数 731
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

var a = {n: 1};
var b = a;
a.x = a = {n: 2};

console.log(a.x);
console.log(b.x);
有道题是这样的,觉得很奇葩,分析一下

 

 

1.对象 引用类型

对象属于引用类型,c,java,js里面都是的,对象就是引用类型,包括数组。

上面的a是引用类型,a保存的是对象 {n: 1}的地址,对这个对象的引用。b = a 。把a里面的地址赋值给了b,b也指向{n: 1}这个对象的物理地址。所以,a 一旦做赋值更改,修改的是a对引用的修改。b也同时修改,b修改的时候,a也会被修改。这就是引用类型。

堆和栈。堆是真实的{n:1} 。栈里面存放的是堆的物理地址,值比较小。根据栈的地址去找堆里面的数据。

 

2.

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

  第二个奇葩结果

 

3.

https://blog.csdn.net/qiphon3650/article/details/78860973

我把这篇看了,然后觉得还是不理解

 就这句: 执行a.x=a,此时a已经指向了新对象,而a.x因为在执行前保留了原引用。

不理解的点是 a都已经改变指向了,a指向了{n: 2},a.x里面的a的指向当然也改变成了{n: 2},为什么,a.x还会保留原引用

 

 

4.我又看了别人写的,觉得这样比较好绕回来

a.x的运算优先级最高

也就是说

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

这段代码可以写成这样

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

  

这样就解释通了

       1.a指向 {n: 1};   ---> var a = {n: 1};

       2.b指向 a指向的这个 {n: 1}  ---> var b = a;

  3.计算 a.x = (a = {n: 2});    a.x的值是 后面值的结果,后面的值先不管。此时 a.x = (某个值),是先计算的。a.x 这个a 指向并没有被         改变

  所以. a.x 里面的a仍然是原来的 {n: 1};a.x里面的值是后面( a = {n: 2})这个结果的返回值。这个返回值是 {n: 2};

       4.所以拆分成a.x = { n: 2 }; 然后原来的a的值被 a = {n: 2},b是对原来对象的引用; a 最后赋值的结果是a = {n: 2};

        所以。a.x是underfined,因为新的a里面并没有 x这个属性

 

 

所以我觉得这个赋值运算的结果,a = {n: 2}这个a并没有更改引用的时候,它的返回值就已经确定了,就先赋值给原来的a.x里面的a了。我只是猜想。。。连等式可能并不会去计算过程,其中所有的值都直接被最后一个等号的值给赋值,其中,引用类型的赋值. 会优先赋值计算。

这个图表示最后的结果,并不能表示赋值过程。

 

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
JavaScript 语法——字面量,变量,操作符,语句,关键字,注释,函数,字符集

JavaScript 是一个程序语言。 语法规则定义了语言结构。 它是一个轻量级,但功能强大的编程语言。 ㈠JavaScript 字面量 在编程语言中,一般固定值称为字面量,如 3.14。 ⑴数字(Number)字面...

osc_tcq8jpfc
2019/09/06
5
0
JavaScript 调试常见报错以及修复方法

如何读懂错误? 首先,让我们快速看下错误信息的结构。理解结构有助于理解错误,如果遇到列表之外的错误会减少麻烦。 Chrome 中典型的错误像这样: Uncaught TypeError: undefined is not a...

刘桂花
2015/10/26
158
0
3-3 官方文档整理-视图层-WXS

【1 概述】 【什么是WXS】WXS(WeiXin Script)是小程序的一套脚本语言,结合 ,可以构建出页面的结构。 【注意】 wxs 不依赖于运行时的基础库版本,可以在所有版本的小程序中运行。 wxs 与 ...

osc_sdo8al3q
2018/09/13
1
0
javascript 中冒号(:)意思?

script language="javascript" type="text/javascript"> <!-- testObj = { prop1 : "hello", prop2 : "hello2", prop3 : new Array("helloa",1,2) } 对象中的属性赋值方式; prop1(属性) : "......

piggybear
2015/02/16
193
0
JavaScript赋值运算符

JavaScript 语言中的赋值运算可以分为简单和复合两种赋值运算,前者是将赋值运算符 右边表达式的值保存到左边的变量中,而后者是混合了其他的操作(例如算术运算符操作)和赋值操作相结合。 ...

凌兮洛
06/08
6
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringCloud- 第六篇 Hystrix参数配置(三)

1:概述 Hystrix使用Archaius作为配置属性的默认实现。官方配置文档: https://github.com/Netflix/Hystrix/wiki/Configuration 每个属性有四个优先级,依次增大: 1:代码的全局默认值 2:动...

osc_7z601p6x
21分钟前
5
0
SpringBoot2 整合JTA组件,多数据源事务管理

本文源码:GitHub·点这里 || GitEE·点这里 一、JTA组件简介 1、JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新...

osc_sju4uxml
23分钟前
11
0
Springboot + Vue + shiro 实现前后端分离、权限控制

本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分...

osc_lbt7zo1x
24分钟前
13
0
docker-compose部署配置jenkins

docker-compose部署配置jenkins 一、docker-compose文件 version: '3.1'services: jenkins: image: jenkins/jenkins:lts volumes: - /data/jenkins/:/var/jenkins_home ......

osc_4p2c0ecc
26分钟前
13
0
第五周

1、查找/etc目录下大于1M且类型为普通文件的所有文件 2、打包/etc/目录下面所有conf结尾的文件,压缩包名称为当天的时间,并拷贝到/usr/local/src目录备份。 3、利用sed 取出ifconfig命令中本...

osc_hxm151is
27分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部