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、css、修改网页)解析三大网页难题

百忙之中抽时间编写了这个小程序,功能是:完美保存整个网页,包括:图片、JS脚本、CSS样式,并且修改网页源码进行“本地化”。由于我火星了,竟然不知道浏览器自带这个功能,因此自己动手做了一个,虽然这个程...

[hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题

hihoCoder太阁最新面经算法竞赛1 穿越禁区

逻辑推理与判断(谜语博士的难题(1))

/**************************************** * File Name : reasoning.c * Creat Data : 2015.1.26 * ...

NYOJ 478 月老的难题 (1)解题报告

月老的烦恼(1) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边...

DFS:C 小Y的难题(1)

解题心得: 1、在明确使用DFS之后一定要找到递归函数的出口、方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值)。递归时也要有递归的方向,最后都能够达到递归的...

fzu 1686 神龙的难题 重复覆盖+DLX 用最少的子矩阵覆盖矩阵没所有的1

Problem Description 这是个剑与魔法的世界.英雄和魔物同在,动荡和安定并存.但总的来说,库尔特王国是个安宁的国家,人民安居乐业,魔物也比较少.但是.总有一些魔物不时会进入城...

每个程序员1小时内必须解决的5个编程问题之难题

昨天看到一篇文章说,软件开发人员应一小时完成的5道题,其中第5道题,还是比较难的。看了一下作者的原来解题思路,就是采用治减法,这是一类问题的算法题,如果没有接触过,确实有点难度。作者提供了JAVA的源...

6招搞定一切电脑难题 1.folder.htt等文件的问题

6招搞定一切电脑难题 1.folder.htt等文件的问题   folder.htt等文件的问题Q12.2:最近在我的电脑的所有文件夹中出现了这样两个文件esktop.ini、folder.htt,怎...

南开百题难题破解(1)

题目要求: 从左到右依次扫描字符串str,把小写字母o左边的所有字符移到该串的右边,并把该小写字母o删除,继续扫描字符串str并做上述操作,直到字符串str中所有的小写字母o被删除为止。 解答如下...

1000个科学难题

  • 2016年05月28日 17:46
  • 8.97MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js中的各种难题(1)
举报原因:
原因补充:

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