首页 > 解决方案 > 问大家一个问题,这是怎么分析的?

问题描述

let a = 1

let b = 2

[a, b] = [b, a]

console.log(a)

console.log(b)

Let 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)

letc = 3没有分号,没有错误,c会变成一个数组。为什么是这样?

在此处输入图像描述

标签: javascript

解决方案


自动分号插入有一些怪癖,这就是其中之一。在您的第一个示例中,不会在第二行的末尾插入分号,因此它会像这样读取解析器:

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];的:它创建一个包含 elements 的数组[b, a],然后尝试将其分配给 2[2]。这对数字 2 没有任何作用,但是您尝试分配的值确实成为表达式的结果,因此 的结果2[a, b] = [b, a];只是[b, a],即[2, 1]。由于代码,这又被分配给 clet c = //etc


推荐阅读