解构赋值
对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面。所有的键和它们的值,都会拷贝到新对象上面
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构( Destructuring )。
为什么要用解构赋值?
想从对象中取出名字为指定名称的属性,使用 for in 加 if 判断再赋值很麻烦,并且若有一个 嵌套的数据结构 则需要遍历寻找所需要而挖掘整个结构,而解构赋值可以直接获取:
ex:
对象:
let { x, y, ...z }= { x: 1, y: 2, a: 3, b: 4 }
console.log(x, y, z) => 1, 2, { a: 3, b: 4 }
z是结构赋值所在对象,获取等号右边所有尚未读取的键,连同值一起拷贝过来
数组:
var [a, b, c] = [1, 2, 4]; // a = 1, b = 2, c = 4
只要两边的模式相同,就能正确地赋值
ex:
let [a, [b,c]] = [1,[2,3]];// a = 1, b = 2, c = 3
let [, , c] = [1,2,3];// c = 3
let [c] = [1,2,3];// c = 1
let [a,c] = [1]; // a = 1, c: undedined
默认值可以引用解构赋值的其他变量,但该变量必须已经声明:
let [x = 1, y = x] = []; // x=1; y=1
let [x = 1, y = x] = [2]; // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = []; // ReferenceError
由于解构赋值要求等号右边是一个对象或数组,所以如果等号右边是undefined
或null
,就会报错,因为它们无法转为对象。
ex:
报错:
let { ...z } = null; // 运行时错误
let { ...z } = undefined; // 运行时错误
let [foo] = NaN
let [foo] = undefined
字符串:字符串被转换成了一个类似数组的对象
1. let [a,b,c] = 'abc';
console.log(a,b,c);// a=a,b=b,c=c
2. let {length:len} = 'hello';
console.log(len);// 5
数值和布尔值:(如果等号右边是数值和布尔值,则会先转为对象)
let {toString: s} = 111;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true