[英]Ask everyone a question, how is this analyzed?
let a = 1 let b = 2 [a, b] = [b, a] console.log(a) console.log(b)
设b = 2
(没有分号)会出错:
2。
let a = 1 let b = 2 let c = 3 [a, b] = [b, a] console.log(a) console.log(b) console.log(c)
设c = 3
没有分号,没有错误, c
将变成一个数组。 为什么是这样?
自动分号插入有一些怪癖,这就是其中之一。 在你的第一个例子中,在第二行的末尾不会插入分号,因此它会像这样读取解析器:
let b = 2[a, b] = [b, a];
这引发了一个异常,因为b尚不存在,但它正试图用来定义自己。 示例2看起来类似,但现在指的是已经存在的变量,因此您只需要一个非常奇怪的代码片段而不是异常:
let c = 2[a, b] = [b, a];
至于这意味着什么,首先让我们看看2[a, b]
。 数字被装箱到对象,因此可以访问它们的属性。 这就是为什么,例如,您可以执行以下操作:
let temp = 2;
console.log(temp.toString());
temp是一个数字对象,它上面有一个toString属性。 现在,因为.
字符对数字有特殊含义(它是小数点),你不能使用数字文字,所以像下面这样的东西是非法的:
2.toString();
但是使用括号语法很好,如:
2['toString']()
这个括号语法就是我们在2[a, b]
:它试图访问2.属性? 2 [b],解析为2 [2]。 a
与奇怪的逗号运算符一起使用 ,基本上被忽略了。
什么是2 [2]? 没什么,只是一个undefined
的属性。 如果你试图分配它,那么就不会发生任何注意事项,因为数字不允许你像这样修改它们的属性。 但是如果你愿意的话,你仍然可以尝试分配它,它会默默地失败(无论如何都是非严格的模式)。
总结一下2[a, b] = [b, a];
确实:它创建一个包含元素[b, a]
的数组,然后尝试将其分配给2 [2]。 这对数字2没有任何作用,但是您尝试分配的值确实成为表达式的结果,因此2[a, b] = [b, a];
只是[b, a]
,这是[2, 1]
。 反过来,这被分配给c,因为代码let c = //etc
神奇的是分号 。 如果没有行分隔符,编译器会感到困惑,并且不知道“预期”逻辑是什么。 它将新线视为空白 。 从而,
let c = 3
[a, b] = [b, a]
变换为单行语句let c = 3[a, b] = [b, a]
。
现在由于双重赋值,使用后面的赋值( [b, a]
)。
c
现在变成一个包含b
然后a
的数组。
这可以在以下内容中看到:
let a = 1 let b = 2 let c = 3 [a, b] = [b, a] console.log(c)
请注意,只需添加分号即可获得“所需”输出:
let a = 1; let b = 2; let c = 3; [a, b] = [b, a]; console.log(c);
黑曜石时代在他的回答中解释得很好但案例1没有解释。 所以,就是这样。
情况1:
let a = 1
let b = 2
[a, b] = [b, a]
console.log(a)
console.log(b)
这里没有分号,编译器会像这样理解它。
let a = 1 let b = 2[a, b] = [b, a] console.log(a) console.log(b)
因此给出了参考错误,因为当你要宣布b时,b尚未被声明。
当你这样做时:
let a = 1
let b = 2
[a, b] = [b, a]
你在做:
let a = 1
let b = 2[a,b] = (this is the assignment which you doing '[b,a]', but `b` is not defined yet)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.