让学习“上瘾”,成为更好的自己!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>圆括号问题</title>
</head>
<body>
<script>
/*
对于编译器来说,一个式子是模式还是表达式,只有解析到(或解析不到)等号才能知道
如果模式中出现圆括号,该怎么处理?
--> 只要可能导致解构歧义的,就不得使用圆括号
【建议】只有有可能发生歧义,就不要在模式中放置圆括号
*/
// 一,不能使用圆括号的情况
// 1, 变量声明语句
// 全部报错
// let [(a)] = [1];
// let {x: (c)} = {};
// let ({x: c}) = {};
// let {(x : c)} = {};
// let {(x): c} = {};
// let {o: ({p: p})} = {o: {p: 2}};
// 2, 函数参数 --> 函数参数也属于变量声明
// 以下都报错
// function f([(z)]){
// return z;
// }
// function f([z, (x)]){
// return x;
// }
// 3, 赋值语句的模式部分
// ({p: a}) = {p: 42};
// ([a]) = [5];
// 上面代码将“整个”模式放在圆括号之中,导致报错
// [({p: a}), {x: c}] = [{}, {}];
// 这一段代码将“一部分”模式放在圆括号之中,导致报错
// 二,可以使用圆括号的情况 --> 赋值语句的非模式部分可以使用圆括号
// 以下3条语句都可以正确执行,因为都是赋值语句,而不是声明语句,且圆括号都不属于模式的一部分
[b] = [3]; // 模式是取数组的第一个成员,与圆括号无关
console.log(b);
({p: (d)} = {}); // 模式是p
[(parseInt.prop)] = [3];
</script>
</body>
</html>