你确定了解连续赋值运算嘛?
来源:互联网 发布:福缘充值软件 编辑:程序博客网 时间:2024/06/03 04:48
连等是先确定所有变量的指针,再让指针指向那个赋值
对于 a.x = a = {n:2},我们可能会这么想:
1.先把 {n:2} 赋值给 a2.然后再创建 a.x,将 {n:2} 再赋值给 a.x
这样似乎确实说不通 a.x
的值是 undefined
,因为 a.x
确实是被赋值了的啊。
可事实上,a.x
的值就是 undefined
。
再来看一下: a = a.x = {n:2}
,按照上面的思路来看的话,应该是:
1.先把 {n:2} 赋值给 a.x,那么也就相当于 b.x = {n:2} 2.再把 a 重新指向 {n:2}。那么这时候 a.x 的值确实是 undefined,a 对象 {n:2} 中就没有 x 属性嘛。
按照这种思路,上述两种方式的结果应该是不同的,但事实却是a = a.x = {n:2}
和a.x = a = {n:2}
的结果是一致的,所以我们想的那种赋值的思路是不对的。
事实上,解析器在接受到 a = a.x = {n:2} 这样的语句后,会这样做:
- 找到 a 和 a.x 的指针。如果已有指针,那么不改变它。如果没有指针,即那个变量还没被申明,那么就创建它,指向 null。
- a 是有指针的,指向 {n:1};a.x 是没有指针的,所以创建它,指向 null。
- 然后把上面找到的指针,都指向最右侧赋的那个值,即 {n:2}。
=========================分割线===============================
从运算符优先级这个角度来看:
.
运算优先于 =
赋值运算,因此此处赋值可理解为
1.声明a对象中的x属性,用于赋值,此时b指向a,同时拥有未赋值的x属性2.对a对象赋值,此时变量名a改变指向到对象{n:2}3.对步骤1中x属性,也即a原指向对象的x属性,也即b指向对象的x属性赋值
赋值结果:
a => {n: 2}b => {n: 1, x: {n: 2 } }
=========================又是分割线=============================
最后以另一个连续赋值题结束。fun 执行后,这里的 变量 b 溢出到 fun 外成为了全局变量,根据右结合性,a的值就是undefined。
function fun(){ var a = b = 5; } fun(); alert(typeof a); // --> objectalert(typeof b); // --> number
参考
https://segmentfault.com/q/1010000002637728
http://justjavac.com/javascript/2012/04/05/javascript-continuous-assignment-operator.html
阅读全文
0 0
- 你确定了解连续赋值运算嘛?
- 你未必全了解的连续赋值运算
- JS:连续赋值运算
- Javascript 连续赋值运算
- js连续赋值运算
- 写了10年Javascript未必全了解的连续赋值运算
- 写了10年Javascript未必全了解的连续赋值运算
- 写了 10 年 Javascript 未必全了解的连续赋值运算
- 写了10年Javascript未必全了解的连续赋值运算
- 写了10年Javascript未必全了解的连续赋值运算
- 写了 10 年 Javascript 未必全了解的连续赋值运算
- javaScript中连续赋值运算
- 值得深思的连续赋值--赋值运算符运算顺序
- 转载:写了10年Javascript未必全了解的连续赋值运算 --> 说明了JS中变量是引用
- 你真的了解模运算吗?
- 你确定你了解widows文件夹的含义吗?——亲爱的内存溢出
- 怎么用CDN给网站加速?大热的CDN,你确定你还不想了解?
- 赋值运算
- HDU
- 设置div根据浏览器自适应高度
- dubbo服务化使用实例
- 我是一个进程
- instanceof与typeof(写一个方法判断数据类型),prototype与_proto_
- 你确定了解连续赋值运算嘛?
- 代码大全
- js的一道经典题目
- js知识整理(一)
- React Native按需加载 手Q狼人杀探索之路
- 我是一个线程
- arm-linux的TFTP 服务器搭建和测试
- git配置
- 多进程与多线程的一个简单解释