标签:运行机制 直接 ons 核心 关系 sig 表达式 就是 计算机
最近在看别人的博客时无意中看到一个这样的问题
var a = {n: 1};
var b = a;
a.x = a = {n:2};
console.log(a.x); //undefined
console.log(a); // {n: 2}
console.log(b); // {n: 1, x: {n: 2}}
这是一个典型的连等赋值问题,是不是发现打印的结果跟自己预料的不太一样,就算一样你能具体讲出内部的执行机制吗?
咋一看这个表达式,我会本能地把它拆解为这样
a={n:2};
a.x={n:2};
所以根据这个理解得出的打印结果是
console.log(a.x); //{n: 2}
显然结果是不对的,那问题出在了哪里呢?要想从原理上解释这个问题,还得首先理解以下几个知识点
放在这个例子中对应的理解就是:
也就是在这个表达式中第一个a和第二个a指向的都是{n: 1};
a.x = a = {n:2}
所以a.x的值就变为了undefined,因为a已经重定向赋值为{n:2}了,而b就指向了复合之后的对象
我最开始查了连等赋值的相关文章时,对于以上这些原理的理解是没什么问题的,关键是在理解最后那个赋值过程时,我有过一种理解
a = {n:2};
a.x={n:2};
// 所以此时a= {n:2, x:{n:2}}
产生这种理解的原因是觉得对a的赋值有个先后顺序,但事实上好像是不存在的。我对上面那种从解析赋值角度去理解的核心就是在连等赋值执行过程中,总共分为两步,一步是变量名解析,一步是赋值,然后根据赋值之后的值去看相应的变量名与变量之间的对应关系。
标签:运行机制 直接 ons 核心 关系 sig 表达式 就是 计算机
原文地址:https://www.cnblogs.com/wancheng7/p/8837037.html