js中的各种难题(1)

转载 2015年07月07日 20:48:53

http://www.cnblogs.com/snandy/archive/2011/03/25/1995003.html

1
2
3
var a = {n:1};
a.x = a = {n:2};
alert(a.x); // --> undefined

以上第二句 a.x = a = {n:2} 是一个连续赋值表达式。这个连续赋值表达式在引擎内部究竟发生了什么?是如何解释的?

证明

上面两种猜想相信多数人都有,群里讨论呆呆认为是猜想1, 我认为是猜想2。其实都错了。我忽略了引用的关系。如下,加一个变量b,指向a。

1
2
3
4
5
var a = {n:1};
var b = a; // 暂存a
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> [object Object]

发现a.x仍然是undefined,神奇的是 b.x 并未被赋值过(比如:b.x={n:2}),却变成了[object Object]。b 是指向 a({n:1})的,只有a.x = {n:2}执行了才说明b是有x属性的。实际执行过程:从右到左,a 先被赋值为{n:2},随后a.x被赋值{n:2}。

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

等价于
a.x = (a = {n:2});

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


a.x 中的a指向的是 {n:1},a 指向的是 {n:2}。如下图

a.x = a = {n:2}
=>
a.x = (a = {n:2})
=>
1. 给a加上一个叫x的属性
2. 给a.x申请一个栈地址,记录为A
3. 把(a = {n:2})得到的堆地址放到A里面
4. 现在要计算a = {n:2}了
5. 给a申请一个栈地址,记为B
6. 把{n:2}得到的堆地址放到B里面

从第5步开始,前面的a和后面的a就没有关系了

解惑

这篇写完,或许部分人看完还是晕晕的。因为里面的文字描述实在是绕口。最初我在理解这个连等赋值语句时

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

认为引擎会限制a.x的重写(a被重写后),实际却不是这样的。指向的对象已经不同了。引擎也没有限制a.x={n:2}的重写。
结束

呵,以另一个连续赋值题结束。fun执行后,这里的 变量 b 溢出到fun外成为了全局变量。想到了吗?

1
2
3
4
5
6
function fun(){
    var a = b = 5;
}
fun();
alert(typeof a); // --> undefined
alert(typeof b); // --> number
这个问题……
囧~~b并没有在 fun 里进行声明,所以 js 就认为是全局变量了。
如果是
var a,b;
a=b=5;
举报

相关文章推荐

js中的各种难题(1)

http://www.cnblogs.com/snandy/archive/2011/03/25/1995003.html 1 2 3 ...

【css】谈谈 css 的各种居中——读编写高质量代码有感

转自:http://www.cnblogs.com/yjzhu/archive/2012/11/19/2773209.html css 的居中有水平居中和垂直居中,这两种居中又分为行...
  • ltx06
  • ltx06
  • 2015-04-24 16:48
  • 225

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

C#中的各种泛型

上一篇文章简单了解了一下强类型以及泛型的知识。其实,在.net类库中有很多的泛型定义,最典型也是我们用的最多的就是List两个泛型集合。这只是微软我们提供的,在实际开发中,我们很多时候还需要自己定义一...

c中各种++的比较

接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1)。     1、++i和i++的区别     如清单1(注意代码中的注释):  [c...

Hadoop中的各种排序

1:shuffle阶段的排序(部分排序) shuffle阶段的排序可以理解成两部分,一个是对spill进行分区时,由于一个分区包含多个key值,所以要对分区内的按照key进行排序,即key值相同的一...

各种居中系列

方法①:margin:0 auto 实现水平居中(必须满足的条件是固定宽度元素) 方法②:text-align:center实现水平居中(测试后在父元素中设置,块级或行内元素可实现,除图片外。其中若父...

js中的各种验证

/**********************一。验证类*****************************/ //对象是否 存在 function isObj(str) { if(st...

Matlab各种疑难

1. set path错误 想要添加搜索路径,按了set path结果提示找不到pathtool(如果pathdef.m确实存在在toolbox\local文件夹下的话,就按照下面的做法做)save...

Android中各种奇葩,难解的Json

Json文件中的字段是java的关键字 示例json { "abstract": "Success", "error_code": 0, "new": "haha" ...

Hibernate表中的1+N的问题

1、所谓1+N的问题,意思是说我们希望查询一张表里面的数据,但是在执行sql语句时,会发生多条和另外对应表的sql语句。这样会降低数据库执行效率和性能。 2.解决1+N的问题的三种方式如下: /...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)