Javascript ES6阵列解构和交换的有趣行为

Javascript ES6阵列解构和交换的有趣行为,javascript,ecmascript-6,destructuring,Javascript,Ecmascript 6,Destructuring,我注意到下面的代码,在let[1,2]=[1,2]之后没有立即引用,尝试[1,2]=[2,1]会崩溃: 让[1,2,3]=[1,2,3] [1,2]=[2,1]//崩溃!一个没有定义 console.logone,two在第1行中添加分号,因为解释器假定第1行和第2行声明同时发生,而第1行和第2行尚未定义: 让[1,2,3]=[1,2,3]; [一,二]=[二,一] console.logone,two在第1行中添加分号,因为解释器假定第1行和第2行声明同时发生,而第1行和第2行尚未定义:

我注意到下面的代码,在let[1,2]=[1,2]之后没有立即引用,尝试[1,2]=[2,1]会崩溃:

让[1,2,3]=[1,2,3] [1,2]=[2,1]//崩溃!一个没有定义
console.logone,two在第1行中添加分号,因为解释器假定第1行和第2行声明同时发生,而第1行和第2行尚未定义:

让[1,2,3]=[1,2,3]; [一,二]=[二,一]
console.logone,two在第1行中添加分号,因为解释器假定第1行和第2行声明同时发生,而第1行和第2行尚未定义:

让[1,2,3]=[1,2,3]; [一,二]=[二,一]
console.logone,两个导致其解析如下:

 let [one, two, three] = [1, 2, 3][one, two] = [one, two]
要使其正常工作,请始终使用paren环绕分解分配:

 let [one, two, three] = [1, 2, 3];
 ([one, two] = [two, one]);
 console.log(one, two);

永远不要相信ASI,如果它出了问题,也会出现类似的情况。

因为它的解析如下:

 let [one, two, three] = [1, 2, 3][one, two] = [one, two]
要使其正常工作,请始终使用paren环绕分解分配:

 let [one, two, three] = [1, 2, 3];
 ([one, two] = [two, one]);
 console.log(one, two);

永远不要相信ASI,如果它出了问题,也会有类似的情况。

oops,似乎是这样。非常有趣的是,丢失分号实际上会带来麻烦。谢谢哦,似乎是这样。非常有趣的是,丢失分号实际上会带来麻烦。谢谢在每行末尾添加分号。您的代码中没有问题这可能是分号存在的原因,省略分号就是要求这样做。在每行末尾添加分号。您的代码中没有任何问题这可能是分号存在的原因,省略分号就是要求这样做。如果前一行没有分号,用括号括起赋值也没有帮助。@bergi是的,但这通常是一个好习惯,尤其是在执行对象destructuringYes时,对于对象,当不在变量声明中,但不在数组中时,它是必需的。在这里,它们对我来说似乎是多余的。如果前一行没有分号,用括号括起赋值也没有帮助。@bergi是的,但这通常是一个好习惯,尤其是在执行对象解构时。是的,对于对象,在不在变量声明中时是必要的,但对于数组则不是。在这里,它们对我来说似乎是多余的。