javascript - 问大家一个问题,这是怎么分析的?
问题描述
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
会变成一个数组。为什么是这样?
解决方案
自动分号插入有一些怪癖,这就是其中之一。在您的第一个示例中,不会在第二行的末尾插入分号,因此它会像这样读取解析器:
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
推荐阅读
- ios - 我可以访问由 CALayer.shouldRasterize = YES 创建的位图数据吗
- c - 如何从输入文件中打印字符的二进制文件?
- flutter - Flutter 的 provider 包是否支持有序监听器?
- angular - Slickgrid:在分组行标题处聚合
- javascript - 用户输入数据并存储在数组中,以空条目显示数据
- libgdx - 如何在一次击键中获得完整的动画循环?
- tensorflow - 使用 5D 张量进行自定义操作
- python - 如何进行两个循环打印,在 2 个不同的行上打印,而不擦除另一个写的内容
- java - SQL 集是什么 Java 类?
- javascript - 在 React 中完成一个动作后调用另一个动作