位置: 编程技术 - 正文

谈谈javascript中使用连等赋值操作带来的问题(简述javascript)

编辑:rootadmin

推荐整理分享谈谈javascript中使用连等赋值操作带来的问题(简述javascript),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:简述javascript,javascript的,javascript的理解,javascript的理解,javascript的语句,简述javascript,请问在javascript程序中,简要说明javascript的作用,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最近一次出现了bug发现JS里的连等赋值操作的特色(坑)。

网上搜索一番发现一个非常好的连等赋值的(来源1,来源2)例子:

答案是:

不知道各位有没有答对,至少我是答错了。

遂借此机会好好看看JS连等赋值是怎么回事

赋值顺序?

假设有一句代码: A=B=C; ,赋值语句的执行顺序是从右至左,所以问题在于:

是猜想1: B = C; A = C; ?

还是猜想2: B = C; A = B; ?

我们都知道若两个对象同时指向一个对象,那么对这个对象的修改是同步的,如:

所以可以根据这个特性来测试连续赋值的顺序。

按照猜想1,把C换成具体的对象,可以看到对a的修改不会同步到b上,因为在执行第一行和第二行时分别创建了两个 {n:1} 对象。如:

再按照猜想2,把C换成具体的对象,可以看到对a的修改同步到了b,因为a和b同时引用了一个对象,如:

测试真正的连等赋值:

可以看到是符合猜想2的,如果有人觉得这个测试不准确可以再来测试,使用ECMA5的setter和getter特性来测试。

首先setter和getter是应用于变量名的,而不是变量真正储存的对象,如下:

可以看到只有obj输出了“getter!!!”,而x没有输出,用此特性来测试。

连等赋值测试2:

通过getter再次证实,在A=B=C中,C只被读取了一次。

谈谈javascript中使用连等赋值操作带来的问题(简述javascript)

所以,连等赋值真正的运算规则是 B = C; A = B; 即连续赋值是从右至左永远只取等号右边的表达式结果赋值到等号左侧。

连续赋值能拆开写么?

通过上面可以看到连续赋值的真正规则,那么再回归到文章开头的那个案例,如果按照上述规则将连续赋值拆开会发现结果不一样了,如:

所以连续赋值语句虽然是遵从从右至左依次赋值的规则但依然不能将语句拆开来写,至于为什么

我猜测:js内部为了保证赋值语句的正确,会在一条赋值语句执行前,先把所有要赋值的引用地址取出一个副本,再依次赋值。

所以我认为这段代码 a.x=a={n:2}; 的逻辑是:

1、在执行前,会先将a和a.x中的a的引用地址都取出来,此值他们都指向{n:1}

2、在内存中创建一个新对象{n:2}

3、执行a={n:2},将a的引用从指向{n:1}改为指向新的{n:2}

4、执行a.x=a,此时a已经指向了新对象,而a.x因为在执行前保留了原引用,所以a.x的a依然指向原先的{n:1}对象,所以给原对象新增一个属性x,内容为{n:2}也就是现在a

5、语句执行结束,原对象由{n:1}变成{n:1,x:{n:2}},而原对象因为无人再引用他,所以被GC回收,当前a指向新对象{n:2}

6、所以就有了文章开头的运行结果,再执行a.x,自然就是undefined了

上述过程按序号图示:

按照上述过程可以看出旧的a.x和新的a都指向新创建的对象{n:2},所以他们应该是全等的。

测试:

因为我们增加了var b=a,即将原对象增加了一条引用,所以在上述第5步时不会被释放,证实了上面的结论。

后记

通过这次了解了连续赋值的特点,再回过头看文章标题,似乎应该叫:

尽量不要使用JS的连续赋值操作,除非真的了解它的内部机制及可能会产生的后果。

javascript给span标签赋值的方法 js给span标签赋值的方法?一般有两种方法:第一种方法:输出htmlbodyonload="s()"spanid="hello"/spanscriptlanguage="javascript"functions(){document.getElementById("hello").innerHTM

基于jquery实现全屏滚动效果 那么今天就来介绍这款fullPage,与fullPage.js是不同的,fullpage兼容性更佳,能向下兼容到IE6,不依赖任何js库,可独立使用。功能上虽然不如fullPage.js强大

JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色 表格GridPanel概述ExtJS中的表格功能非常强大,包括了排序、缓存、拖动、隐藏某一列、自动显示行号、列汇总、单元格编辑等实用功能。表格由类Ext.grid.

标签: 简述javascript

本文链接地址:https://www.jiuchutong.com/biancheng/386297.html 转载请保留说明!

上一篇:js检测iframe是否加载完成的方法(js判断iframe是否加载完成)

下一篇:javascript给span标签赋值的方法(js的span标签)

  • 一般纳税人暂未开具发票
  • 年度应纳税所得额计算公式
  • 财务软件无形资产摊销几年
  • 应交增值税账面和申报表不符
  • 核定征收的固定资产包括
  • 联营返点收入账务处理
  • 财务公司承兑汇票是商票还是银票
  • 学校捐赠收入需上交吗
  • 增值税扣完税款还能更改吗
  • 当月采购发票未到如何做账及结转成本?
  • 投标保证金以现金的形式缴纳,能以现金的形式退回吗
  • 经营性的资产项目有哪些
  • 做企业所得税汇算清缴前需要准备什么资料
  • 资产总计与负债和所有者权益总计不一致
  • 特种设备培训费计入什么会计科目
  • 固定资产折旧提足怎么办
  • 试用期可以不交五险一金吗
  • 工会经费缴纳是当期
  • 多抵扣的进项如何做分录
  • 公司与客户合作协议范本
  • 转出未交增值税借方余额表示什么
  • 融资租入的设备为什么属于资产
  • php数组函数实现机选双色球
  • 固定资产的税务筹划
  • 重楼的功效与作用价格
  • linux架构师是做什么的
  • 房地产项目如何通过抖音宣传
  • Windows11报sill idealTree buildDeps安装慢或者卡顿解决方案
  • 房地产会计核算地上地下成本分摊
  • 脐橙产业可行性报告
  • 包装物押金收入是否计入销售额
  • 金税三期个税扣缴客户端
  • 收到预付货款下月交货会计分录
  • 注册公司时的注册资金
  • 餐费计入什么费用
  • html游戏大全
  • 使用nvm安装nodejs后无法执行node命令
  • php 队列
  • 非营利组织缴纳增值税账务处理
  • 现金日记账退回的现金怎么填写
  • 汽修厂利润能达到一半吗
  • 建筑设备的概念,作用及其研究内容
  • 会计凭证分为几个部分包括哪些内
  • 无形资产出租如何入账
  • 财务负责人需要承担什么风险
  • 充电口有烧焦味怎么简单解决
  • MySQL: mysql is not running but lock exists 的解决方法
  • 小规模纳税人免税怎么做账
  • 工商年审中实缴还是虚缴
  • 如何核算小企业成本
  • 电梯折旧率多少
  • 电商公司不用交税吗
  • 电子银行承兑汇票操作流程
  • 企业收到退回的银行汇票多余款项时,应作的会计处理有
  • 以他人名义投资该签订什么协议
  • 个人贷款打到公司账户存在什么风险
  • 建设项目开办费包括哪些
  • 按预测范围不同划分为以下几类
  • 分公司做账报税
  • 会计凭证会计账簿与账务处理程序
  • sqlserver2000数据库安装教程
  • freebsd中文手册
  • win7系统如何卸载流氓软件
  • ubuntu15.04系统怎么使用卸载命令卸载软件?
  • ubuntu每次开机都会进入grub
  • win10怎么检查
  • win7没有媒体功能
  • linux 排序统计
  • 2016年Win10 Mobile红石更新抢先看 预期新功能/发布时间表
  • gpio接口
  • js中使用组件
  • javascript Event对象详解及使用示例
  • linux c语言获取当前路径
  • java栈怎么写
  • bootstrap学习
  • js动态添加trtd
  • 大征期和小征期的区别
  • 登录""增值税发票选择确认平台""时提示""打开设备
  • 总包发票税率
  • 12366国税网上申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设