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;

记录各个简单却又经典的题目,每一个都能认识到自己的弱

窝觉得自己好几把菜,而且做的题太少了,这一篇博客长期更新,自己会有意识的去做各种经典问题,可能会一次又一次的认识自己有多么菜,但是坚持下去。所以题目的代码都可以自己去对应oj的账号上去看, 或者在桌...
  • qq_24664053
  • qq_24664053
  • 2016年04月12日 14:54
  • 359

nyoj 744 蚂蚁的难题(一) (找规律,位运算,数论)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=744 蚂蚁的难题(一) 时间限制:1000 ms  |  内存限制:655...
  • Strokess
  • Strokess
  • 2016年05月09日 20:40
  • 460

JS中的各种尺寸问题

1鼠标 clientX 设置或获取鼠标指针位置相对于浏览器内容窗口的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条。  clientY 设置或获取鼠标指针位置相对于浏览器内容窗口的 y 坐标...
  • qq_33574890
  • qq_33574890
  • 2017年08月30日 20:00
  • 91

JavaScript及jQuery中的各种宽高属性图解

原文链接 http://blog.poetries.top/2016/12/13/js-props 声明:本文根据慕课网学习视频整理 强烈建议打开控制台自己动手练习一遍,这样印象才会深刻第一部分...
  • jingguanliuye
  • jingguanliuye
  • 2016年12月23日 09:01
  • 1462

js各种距离区分

2. 小小总结一小下" title="clientWidth/scrollWidth/offsetWidth 小小总结一小下" style="margin:0px; padding:0px; bor...
  • Christine95
  • Christine95
  • 2016年03月12日 21:06
  • 612

Js和JQ求对象尺寸的几个方法

Width:                   content          padding               border               margin jascri...
  • csdnear
  • csdnear
  • 2017年08月06日 21:11
  • 65

js中的各种宽高

额。前几天因为电脑屏幕被我坐坏了,没有办法更(借口借口,坏了三天而已,自己懒) 我自己也是新人,如果有哪里说的不对的话,希望大家能够留言批评纠正,谢谢大家!(虽然没有几个人看) 言归正传,今天说说各...
  • qq_39204474
  • qq_39204474
  • 2017年09月27日 15:30
  • 72

codevs售货员的难题 —— 状态压缩动态规划[四星]

题目链接:戳我~题目描述 Description某乡有n个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程s是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村...
  • Loi_Seavot
  • Loi_Seavot
  • 2015年10月12日 19:10
  • 1069

1 . JS中的!=、== 、!==、===的用法和区别。

var num = 1; var str = '1'; var test = 1; test == num //true 相同类型 相同值 test === num //true...
  • a2241076850
  • a2241076850
  • 2017年02月16日 14:09
  • 843

NYOJ 673 悟空的难题

#include #include #define MAXN 1000000+5 int a[MAXN]; int cmp(const void *a,const void *b) { return...
  • qq_16767427
  • qq_16767427
  • 2014年07月16日 00:30
  • 512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js中的各种难题(1)
举报原因:
原因补充:

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