JavaScript的连续赋值的思考

  下面是一个连续赋值的例子:

  

  在这里面,先创建a对象并添加n:1,然后将a对象赋值给b,这时候a和b引用同一个对象。最后我们要着重理解这最后一行代码

a.x = a = {n:2};

  按照我们平常的思维,应该是{n:2}赋值给 a,a的引用改变了,但b仍然是原来的引用,然后再赋值给a.x,这时候a是{n:2,x:{n:2}},也即是a.x={n:2}。但是,很显然我们的执行结果不是这样的,为什么会这样呢?

  其实这是调皮的运算优先级搞的鬼,a.x成员访问的优先级仅次于括号(),成员访问.访问的属性如果不存在就会被创建并且该成员访问表达式的值是undefined。这里的会先执行a.x,此时为a动态的创建了x属性,属性值默认为undefined,并且由于b引用和a同一个地址,所以也拥有b.x这个属性。然后开始赋值运算a={n:2},此时a的指向地址更改,注意这时候a.x(b.x)仍然是原先地址的属性,更改变引用地址的a已经没有关系了。然后是a.x={n:2},所以b.x={n:2},并且由于a指向的是新地址,当执行a.x的时候,a.x=undefined

时间: 2024-10-13 14:00:29

JavaScript的连续赋值的思考的相关文章

JavaScript前端框架的思考

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:现在JavaScript前端框架层出不穷,尤其Angular进入到2.x时候之后,我们如何应对?今天推荐的国内技术专家xufei的文章<后Angular时代二三事>可以带给我们一些启发. 之前一直比较关注前端框架,也多次发文章介绍过和前端相关的内容.今天推荐的这篇由xufei编写<后Angular时代二三事>文章,系统讲述了目前前端框架的一些问题和趋势.作者尤其分享了对

关于JavaScript闭包运用的思考

一.软件开发中模块化的重要性 在面向对象的世界里,类无疑是最重要的概念,她有效地将软件系统中的各个部分进行模块化分离,避免了相互之间的影响.在面向过程的语言开发过程中,时常会发现代码动不动就冗余,动不动就想着去Ctrl-c Ctrl-v,动不动就碰到命名冲突的问题,致使整个软件系统不易于理解,并大大增加了开发难度,难以开发出复杂度高的软件.这就是面向对象思想出现的契机与意义,相信诸位对面向对象的思想也十分熟悉,其核心无非于通过类的角度来描述整个软件系统的业务逻辑,以达到系统模块化,代码复用的目的

javascript的new运算的思考

看到一篇关于javascript单例的文章 http://blog.crazycoder.cc/post/13 对javascript new运算有些思考: 情况1: function test1(){ return {name:'test1'}; }; new test1的结果:{name:'test1'} 情况2: function test2(){ }; test2.prototype={name:'test2'}; new test2 的结果:{name:'test2'} 情况3: fu

javascript this的一些误解

太拘泥于"this"的字面意思就会产生一些误解.有两种常见的对于this 的解释,但是它们都是错误的. 介绍之前先解释下什么是动态作用域 简要地分析一下动态作用域,重申它与词法作用域的区别.但实际上动态作用域是JavaScript 另一个重要机制this 的表亲.词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则.词法作用域最重要的特征是它的定义过程发生在代码的书写阶段(假设你没有使用eval() 或with).动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态

6月第4周--javascript 事件机制

本周任务,对javascript事件机制进行思考 提供以下 几个博文 论点: 1.javascript事件模型 2.e.target与e.currentTarget是干什么的? 3.preventDefault与stopPropagation是干什么的 4.什么是dispatchEvent? 5.说一说事件代理的实现,并封装一个方法 6.事件代理的问题<li><span></span></li>如果同时给span与li绑定事件该如何组装冒泡??? 7.tap

unity3d游戏开发之第一人称射击游戏

简介 这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思考的技巧. 前提 这个教程假定你已经熟悉软件Unity基本操作,掌握了基本的脚本概念. 创建新工程 下载FPS_Tutorial.zip压缩文件,解压,在Unity中打开工程文件. 从Unity安装目录导入Standard Assets资源包. 导入工程后,你会在Unity工程面板中的"Standard Assets"文件夹下看见这些资源内容

JS探秘——那些你理解存在偏差的问题

Javascript的连续赋值运算 var a = {n:1}; a.x = a = {n:2}; alert(a.x); // --> undefined 看 jQuery 源码 时发现的这种写法. 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式. 这个连续赋值表达式在引擎内部究竟发生了什么?是如何解释的? 加一个变量 b,指向 a. var a = {n:1}; var b = a; // 持有a,以回查 a.x = a = {n:2}; alert(a.x);// -->

分享一道我认为非常有思考价值JavaScript题目

这是一道综合性的题目,如果你能快速清晰的分析整理出来,那我相信你对JavaScript是有一定的理解的了.我会先将题目的图片截取出来,供大家思考,在结尾在给出我的分析过程和答案,作个总结. 好,废话不多说啦,我们马上来看看! 好,希望大家现在好好思考一下,result的值会是多少.下面我会给出答案. 我们用node打印一下看看 答案是 -2,亲爱的朋友们,你做对了吗? 下面我将写出我对这题的思路解析,仅供参考噢. 我们直接看到函数调用 partialFn(f, 2) ,这里的意思就是传入两个参数

关于javascript模块加载技术的一些思考

前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requirejs和seajs是新东西新技术,很有价值所以想用它. 这位网友的问题引起了我对javascript模块加载技术的思考,上篇文章我给出了自己写的一个javascript库的基本结构,其实写这篇文章的一个起因就是因为我想使用requirejs或者seajs这样的技术来重新设计我写javascrip