gpt4 book ai didi

javascript - 这个 JavaScript 代码片段的结果是什么,为什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:52:39 25 4
gpt4 key购买 nike

我是 JavaScript 的新手,刚遇到这个问题。无法通过谷歌搜索和在 stackoverflow 上搜索来解决。代码片段如下:

var a = { n : 1};    
var b = a;
a.x = a = {n: 2};
console.log(a.x);
console.log(b.x);

据我目前所知,a.x = a = {n:2}; 等于:

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

最终使 a 等于 {n:2, x:{n:2}}。所以a.x应该等于{n:2},因为b = a,所以b.x = {n:2}。但是我在浏览器中运行的结果是:alert(a.x)undefinedalert(b.x)[object object].

谁能解释一下为什么?非常感谢。

最佳答案

这是运算符优先级的问题,问题是这里涉及三个运算符:= , = , 和 . .

.运算符优先级高于 = ,这意味着 a.x在分配发生之前进行评估。之后,重新分配 a中间语句不能影响 a 的值在表达式 a.x 中因为它已经被评估过了。

我们可以用下面的代码观察这一点:

var _a;
var logging = false;
Object.defineProperty(window, 'a', {
get: function () {
if (logging) {
console.log('getting a');
}
return _a;
},
set: function (val) {
if (logging) {
console.log('setting a');
}
_a = val;
}
});

a = { n : 1};
var b = a;

logging = true;
a.x = a = {n: 2};
logging = false;

console.log(a.x);
console.log(b.x);

我们在这里可以看到a在我们正在讨论的语句的过程中,它的 getter 它的 setter 之前被访问,而且它只被访问一次。这告诉我们 a.x正在评估之前 a.x = .... .

您出错的地方是该语句实际上是这样计算的:

a = {n:  2}
[the value that a referred to before the statement started executing].x = {n : 2};

换句话说,标识符 a在语句开始执行之前被“绑定(bind)”,属性引用将在语句期间引用该绑定(bind)值。

在这种情况下,[the value that a referred to before the statement started executing]相当于b , 但它不等于 a 的新值.这就是为什么 b.x有一个值和 a.x没有。

你可以说这个过程是这样的:

var a = { n : 1};    
var b = a;

var temp = a;
var newVal = {n: 2};
a = newVal;
temp.x = newVal;

console.log(a.x);
console.log(b.x);

这会产生与您的原始代码相同的结果。

ECMAScript Spec列出了评估 LeftHandSideExpression = AssignmentExpression 形式的AssignmentExpression 的过程。前两步是:

  1. 设 lref 为计算 LeftHandSideExpression 的结果。
  2. 令 rref 为评估 AssignmentExpression 的结果。

这清楚地表明赋值的左侧先于右侧求值

关于javascript - 这个 JavaScript 代码片段的结果是什么,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49000564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com