let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] let [x = y, y = 1] = []; // ReferenceError: y is not defined x用y做默认值时,y还没有定义
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; === let { bar:bar, foo:foo } = { foo: 'aaa', bar: 'bbb' }; //也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。 //真正被赋值的是后者,而不是前者 let { bar:x, foo:y } = { foo: 'aaa', bar: 'bbb' }; //x 'bbb' y 'aaa' let { bar:x='123', foo:y='jjj' } = { foo: 'aaa' }; // x '123' y 'aaa' let obj = { p: [ 'Hello', { y: 'World' } ] }; let { p, p: [x, { y }] } = obj; x // "Hello" y // "World" p // ["Hello", {y: "World"}]
字符串的结构
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
let {length : len} = 'hello'; len // 5
原文 :https://www.yuque.com/docs/share/87ecf850-3c65-4a66-8a81-72232ed5e265?# 《结构赋值的小知识点》