解构(模式匹配)
数组解构:
-
等号左边的变量放到中括号内部,匹配右侧数组中得元素
// 数组的不完全解构 // let [a,b] = [1,2,3]; // console.log(a,b); //1,2 let [a,b,c] = [1,[2,3],4] console.log(a,b,c); //1 [ 2, 3 ] 4
// 拓展运算符 ... // ...用在=左边,有聚合的作用,生成新的对象或者数组 // ...用在=右边,有拆分、剥离的作用 let [a,...b] = [1,2,3] console.log(a,b); //1 [ 2, 3 ]
// 数组解构设置默认值,默认值也可以为一个函数 let [a,b,c=10] = [1,2] console.log(a,b,c); //1 2 10 // function myFun(){ // console.log('函数'); // } // let [a,b,c = myFun()] = [1,2] // console.log(a,b,c); //函数 1 2 undefined
对象解构
-
等号左边的变量放到大括号内部,匹配右侧数组中的元素。对象的属性没有次序,变量必须与属性同名,才能取到正确的值
// 对象解构,使用对象的简写形式,(省略key,保留value对应的变量) let {name:username,age:userage} = {name:'张三',age:12} console.log(username,userage); //张三 12
// 嵌套解构 let obj = {p:['Hello',{y:'World'}]} let {p:[a,{y:b}]} = obj console.log(a+b); //HelloWorld
// 默认值(默认值生效的条件是,对象的属性值严格等于undefined) let {name,age,gender='male'} = {name:'张三',age:12} console.log(name,age,gender); //张三 12 male
// 拓展运算符完成对象的深克隆 let obj1 = {a:1,b:2,c:3} let {...b} = obj1 console.log(b); //{ a: 1, b: 2, c: 3 } console.log(b === obj1); //false
字符串解构
- 等号左边的变量如果放在中括号内进行的类似于数组解构,从字符串中获取指定字符;如果放在大括号内进行的类似于对象解构,从实例属性获方法中解构。
// 字符串既可以使用[]解构,也可以使用{}解构
// 使用[]解构字符串内部的字符
// 使用{}解构字符串原型中的方法和属性
let [a, b, c, d, e] = 'hello'
console.log(a, b, c, d, e); //h e l l o
let { length, toString } = 'hello'
console.log(length, toString); //5 [Function: toString]
// 字符串转数组(数组解构、拓展运算符)
let [...arr] = 'hello'
console.log(arr); //[ 'h', 'e', 'l', 'l', 'o' ]
数值解构
- 等号左边的变量放在大括号中进行解构,可以获取到数值包装器构造函数原型中指定的方法。
//数字和Boolean只能使用{}解构其原型对象中的方法和属性
// 而不能使用[]解构,因为他们都是不可迭代的
// let [a,b] = 10;
// console.log(a,b); //TypeError: 10 is not iterable
let {valueOf} = 12;
console.log(valueOf); //[Function: valueOf]
布尔类型解构
- 等号左边的变量放在大括号中进行解构,可以获取到布尔包装器构造函数原型中指定的方法。
let [c] = true; //TypeError: true is not iterable