()
运算符将{}
产生的块作用域转换为表达式let a;
// {a} = {a : 1}; // 报错
({a} = {a : 1});
console.log(a); // 1
let arr = [1, 2, 3],
obj = {};
[obj.a, obj.b, obj.c] = arr;
console.log(obj); // {a: 1, b: 2, c: 3}
let [a] = [1];
// let [(a)] = [1]; // 报错
console.log(a); // 1
let {a : b} = {};
console.log(b); // undefined
// let {a : b} = {}; // 报错
// let ({a : b}) = {}; // let is not defined
// let {(a): b} = {}; // 报错
// let {a: (b)} = {}; // 报错
console.log(a);
// function foo([z]) { // 报错
// return z;
// }
// function foo([(z)]) { // 报错
// return z;
// }
function foo((([z]))) { // 报错
return z;
}
console.log(foo(1));
let arr = [1, 2, 3];
let {
0: first,
[arr.length - 1]: last
} = arr;
console.log(first, last); // 1 3
[(a)] = [1];
console.log(a); // 1
([a]) = [2]; // 匹配规则不同 规则:() -> [] 应该是:[] -> []
console.log(a); // 报错
({a : (b) = {}}); // b的默认值(本身并没有匹配)
console.log(b); // {}
var a = {};
[(a.b)] = [3];
console.log(a); // {b: 3}
console.log(b); // 报错 b is not defined
let a = 'x', b = 'y', obj = {};
// {a: obj[a + b]} = {a: 2}; // 会报错
({a: obj[a + b]} = {a: 2}); // 需要加括号变成表达式
console.log(obj); // {xy: 2}
let a = 1, b = 2;
[b, a] = [a, b];
console.log(a, b); // 2 1
let {a: x, a: y} = {a: 1};
console.log(x, y); // 1 1
var x = 200, y = 300, z = 100;
var obj1 = {
x: {
y: 42
},
z: {
y: z // 100
}
// y: x = { y: 300 }
// z: { y: }
}
// x = {y : y}}是变量y的默认值;y属性在obj1里没有,是undefined,则找默认值 y是属性,值y从外层找
({y: x = {y: y}} = obj1); // y: x = {y: 300}
({z: y = {y: z}}) // z: y = {y: 100}
// obj1中有x的属性值 所以 z = x的属性值,即{y: 42} => {y: x}
({x: z = {y: x}}) // x: z = {y: 42}
console.log(x.y, y.y, z.y); // 300 100 42
function test([a, b]) {
console.log(a, b);
}
test([1,2]);
test([1]); // 1 undefined
test([]); // undefined undefined
test(); // 报错
function foo({x, y}) {
console.log(x, y);
}
foo({x: 1,y: 2}); // 1 2
foo({x: 1}); // 1 undefined
foo({}); // undefined undefined
foo(); // 报错
function foo({x = 10} = {}, {y} = {y: 10}) {
console.log(x, y);
}
foo(); // 10 10
foo({}, {}); // 10 undefined
foo({x: 2}, {y: 3}); // 2 3
({x = 10} = {}); // -> x是属性的默认值,这里简写了 {x: x = 10}
({y} = {y: 10}); // -> y也简写了 {y: y}
const [a, b, c, d] = 'love';
console.log(a, b, c, d); // l o v e
let {length : len} = 'love';
console.log(len); // 4
let {toString: s} = 1;
console.log(s === Number.prototype.toString);
let {toString: s} = false;
console.log(s === Boolean.prototype.toString);