字符串可以被解构赋值是因为字符串被转换成一个类似数组的对象
const [a, b, c, d, e] = 'HELLO';
console.log(a, b, c, d, e); // H E L L O
类似数组的对象都会有一个length属性,因此可以对这个属性解构赋值
const { length: len } = 'MRWANG';
console.log(len); // 6
数值和布尔值的解构赋值
解构赋值时,等号右边是数值和布尔值,会先转为对象
数值和布尔值的包装对象都有toString属性,所以变量可以取到值
let { toString: s } = 123;
console.log(s === Number.prototype.toString); // true
let { toString: x } = true;
console.log(x === Boolean.prototype.toString);// true
解构赋值的规则:只要等号右边的值不是对象或数组,就先将其转为对象,否则报错;
let { prop : x } = undefined; // 报错
let { prop : y } = null; // 报错
函数参数的解构赋值
function add([a, b]) {
return a + b;
}
console.log(add([1, 1])); // 2
console.log(add([2, 2])); // 4
add的参数表面上是个数组,传入参数的那一刻,数组参数就被解构成a和b。
举个🌰(同上)
let num = [
[1, 2],
[3, 4]
].map(([a, b]) => a + b);
console.log(num) // [3, 7]
函数参数的解构也可以使用默认值
🌰 NO、1
-
这个例子是给函数中的x和y变量指定默认值
function move({ x = 0, y = 0 } = {}) { console.log(x, y); return [x, y] } move({ x: 1, y: 1 }); // 1 1 move({ x: 3 }); // 3 0 move({}); // 0 0 move({}); // 0 0
🌰 NO、2
-
这个例子是给函数move的参数指定默认值,得到的与上面的解构是不同的
function move({ x, y } = { x: 0, y: 0 }) { console.log(x, y); return [x, y] } move({ x: 1, y: 1 }); // 1 1 move({ x: 3 }); // 3 undefined move({}); // undefined undefined move({}); // undefined undefined
undefined就会触发函数参数的默认值
let arrs = [1, undefined, 3].map((x = 'x') => x)
console.log(arrs); // [1, "x", 3]