繁体   English   中英

问大家一个问题,这是如何分析的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM