数组的解构赋值
解构赋值是什么
// 1.认识解构赋值 // const arr = [1, 2, 3]; // const a = arr[0]; // const b = arr[1]; // const c = arr[2]; // console.log(a, b, c); // const [a, b, c] = [1, 2, 3]; // console.log(a, b, c); // 2.什么是解构赋值 // 解析某一数据的结构,将我们想要的东西提取出来,赋值给变量或常量
数组解构赋值的原理
// 1.模式(结构)匹配 // [] = [1, 2, 3]; // 2.索引值相同的完成赋值 // const [a, b, c] = [1, 2, 3]; // console.log(a, b, c); // 不取的,可以直接用逗号跳过 const [a, [, , b], c] = [1, [2, 4, 5], 3]; console.log(a, b, c);
数组解构赋值的默认值
// 1.默认值的基本用法 // const [a, b] = []; // const [a, b] = [undefined, undefined]; // const [a = 1, b = 2] = []; // console.log(a, b); // 2.默认值的生效条件 // 只有当一个数组成员严格等于(===)undefined 时,对应的默认值才会生效 // const [a = 1, b = 2] = [3, 0]; // const [a = 1, b = 2] = [3, null]; // const [a = 1, b = 2] = [3]; // console.log(a, b); // 3.默认值表达式 // 如果默认值是表达式,默认值表达式是惰性求值的 const func = () => { console.log('我被执行了a'); return 1; }; // const [x = func()] = [1]; const [x = func()] = []; console.log(x);
数组解构赋值的应用
// 1.常见的类数组的解构赋值 // arguments // function func() { // // console.log(arguments); // // console.log(arguments.push); // const [a, b] = arguments; // console.log(a, b); // } // // func(); // func(1, 2); // NodeList // console.log(document.querySelectorAll('p')); // const [p1, p2, p3] = document.querySelectorAll('p'); // console.log(p1, p2, p3); // 2.函数参数的解构赋值 // const array = [1, 1]; // // const add = arr => arr[0] + arr[1]; // const add = ([x = 0, y = 0]) => x + y; // // console.log(add(array)); // console.log(add([])); // [x,y]=[1,1] // 3.交换变量的值 // let x = 1; // let y = 2; // let tmp = x; // x = y; // y = tmp; // console.log(x, y); // [x, y] = [y, x]; // [x, y] = [2, 1]; // console.log(x, y);
对象的解构赋值
对象解构赋值的原理
// 1.模式(结构)匹配 // {}={} // 2.属性名相同的完成赋值 // const { age, username } = { username: 'Alex', age: 18 }; // const { age: age, username: username } = { username: 'Alex', age: 18 }; // console.log(age, username); // 取别名 const { age: age, username: uname } = { username: 'Alex', age: 18 }; console.log(age, uname);
对象解构赋值的注意事项
// 1.默认值的生效条件 // 对象的属性值严格等于 undefined 时,对应的默认值才会生效 const { username = 'ZhangSan', age = 0 } = { username: 'alex' }; console.log(username, age); // 2.默认值表达式 // 如果默认值是表达式,默认值表达式是惰性求值的 // 3.将一个已经声明的变量用于解构赋值 // 如果将一个已经声明的变量用于对象的解构赋值,整个赋值需在圆括号中进行 // let { x } = { x: 1 }; // console.log(x); // let x = 2; // // ({ x } = { x: 1 }); // [x] = [1]; // console.log(x); // 4.可以取到继承的属性 // const { a = 1} = {}; // const { toString } = {}; // // console.log(toString); // // Object.prototype // // console.log(Object.prototype); // console.log({});
对象解构赋值的应用
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <title>对象解构赋值的应用</title> </head> <body> <script> // 1.函数参数的解构赋值 // const logPersonInfo = user => console.log(user.username, user.age); // const logPersonInfo = ({ age = 0, username = 'ZhangSan' }) => // console.log(username, age); // // logPersonInfo({ username: 'alex', age: 18 }); // logPersonInfo({}); // // { age, username:username }={ username: 'alex', age: 18 } // 2.复杂的嵌套 const obj = { x: 1, y: [2, 3, 4], z: { a: 5, b: 6 } }; // const { x, y, z } = obj; // console.log(x, y, z); const { y, y: [, yy], z, z: { b } } = obj; console.log(yy, y, z, b); // [, yy] = [2, 3, 4] </script> </body></html>
其它数据类型的解构赋值
字符串的解构赋值
// ''='hello' × // 数组形式的解构赋值 // const [a, b, , , c] = 'hello'; // console.log(a, b, c); // 对象形式的解构赋值 // const { 0: a, 1: b, length } = 'hello'; // console.log(a, b, length); // console.log('hello'.length); // 字符串既可以按数组形式来解构赋值,也可以按对象形式来解构赋值
数值和布尔值的解构赋值
// 先将等号右边的值转为对象 // console.log(new Number(123)); // const { a = 1, toString } = 123; // console.log(a, toString); // const { b = 2, toString } = true; // console.log(b, toString);
undefined和null的解构赋值
// 由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错 // const { toString } = undefined; const { toString } = null;