ES6 结构赋值

ES6 结构赋值

官方概述

解构赋值是对赋值运算符的扩展。

是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。

  1. 数组模型的解构(Array)
  • 基本
let [a, b, c] = [1, 2, 3];
// a = 1
// b = 2
// c = 3
  • 可嵌套
let [a, [[b], c]] = [1, [[2], 3]];
// a = 1
// b = 2
// c = 3
  • 可忽略
let [a, , b] = [1, 2, 3];
// a = 1
// b = 3
  • 不完全解构
let [a = 1, b] = []; // a = 1, b = undefined
  • 剩余运算符
let [a, ...b] = [1, 2, 3];
//a = 1
//b = [2, 3]
  • 字符串等

在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。可遍历对象即实现 Iterator 接口的数据。

let [a, b, c, d, e] = 'hello';
// a = 'h'
// b = 'e'
// c = 'l'
// d = 'l'
// e = 'o'
  • 解构默认值
let [a = 2] = [undefined]; // a = 2

当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。

let [a = 3, b = a] = [];     // a = 3, b = 3
let [a = 3, b = a] = [1];    // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2
  • a 与 b 匹配结果为 undefined ,触发默认值:a = 3; b = a =3
  • a 正常解构赋值,匹配结果:a = 1,b 匹配结果 undefined ,触发默认值:b = a =1
  • a 与 b 正常解构赋值,匹配结果:a = 1,b = 2
  1. 对象模型的解构(Object)
  • 基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
// foo = 'aaa'
// bar = 'bbb'
 
let { baz : foo } = { baz : 'ddd' };
// foo = 'ddd'
  • 可嵌套可忽略
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello'
// y = 'world'
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, {  }] } = obj;
// x = 'hello'
  • 不完全解构
let obj = {p: [{y: 'world'}] };
let {p: [{ y }, x ] } = obj;
// x = undefined
// y = 'world'
  • 剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}
  • 解构默认值
let {a = 10, b = 5} = {a: 3};
// a = 3; b = 5;
let {a: aa = 10, b: bb = 5} = {a: 3};
// aa = 3; bb = 5;

简单理解

let [a,b]=[1,2];//数组结构
        console.log(a);//1
        console.log(b);//2
let person={uname:"qq",age:18};//对象结构
        let {uname,age:myage}=person;//myage属于别名
        console.log(uname);
        console.log(myage);```

### ES6 解构赋值的底层实现原理 #### 数组解构 数组解构是一种简洁的方式来提取数组中的元素并将其分配给变量。其实现基于迭代器协议(Iterator Protocol)。当执行数组解构时,JavaScript 引擎会调用目标数组的 `Symbol.iterator` 方法来获取其内部迭代器对象[^4]。 以下是数组解构的一个简单示例及其背后的机制: ```javascript let [a, b] = [10, 20]; console.log(a); // 输出: 10 console.log(b); // 输出: 20 ``` 在此过程中,右侧的数组 `[10, 20]` 被视为可迭代对象,引擎依次访问该数组的第一个和第二个元素,并分别将它们赋值给左侧声明的变量 `a` 和 `b`。 如果存在默认值,则会在无法匹配到对应位置的值时使用默认值: ```javascript let [c = 5, d = 6] = [undefined, null]; console.log(c); // 输出: 5 (因为 c 对应的位置为 undefined) console.log(d); // 输出: null (null 不触发默认值逻辑) ``` 这种行为表明,默认值仅在对应的槽位为空或未定义的情况下生效。 #### 对象解构 对象解构的核心在于键名映射而非顺序关系。与数组不同的是,对象解构依赖于属性名称的一一对应。具体而言,在运行时,JavaScript 将右侧行对象上的指定键与其左端的目标变量绑定在一起[^1]。 下面是一个典型的对象解构案例以及它的工作方式: ```javascript const obj = { name: "Alice", age: 25 }; let { name, age } = obj; console.log(name); // 输出: Alice console.log(age); // 输出: 25 ``` 这里的关键点是 `{name}` 实际上代表了一种隐式的映射操作:即寻找名为 `"name"` 的字段并将之赋予局部作用域内的同名变量 `name`。如果没有找到相应的键或者提供了别名,则可以通过冒号完成重命名过程: ```javascript let { name: fullName, age } = obj; console.log(fullName); // 输出: Alice console.log(age); // 输出: 25 ``` 上述代码片段展示了如何利用冒号改变原始数据结构中某个特定项所关联的新标识符名字。 #### 底层细节补充 无论是数组还是对象形式下的解构表达式,最终都转换成一系列独立的操作语句。例如对于如下一段程序: ```javascript let [firstElement, secondElement] = someArray; ``` 实际上相当于做了这样的事情(伪代码表示): ```pseudo-code var iteratorResult = someArray[Symbol.iterator](); var firstElement = iteratorResult.next().value; var secondElement = iteratorResult.next().value; if (!iteratorResult.done){ throw new TypeError('Too many initializers'); } ``` 这意味着每次从源集合里取出下一个成员直到满足所有待初始化的需求为止;如果有剩余而没有地方存储的话就会抛出异常提示错误情况发生。 另外值得注意的地方还包括嵌套模式的支持能力——允许我们进一步深入复杂的数据层次去抓取所需部分的信息而不必手动一层层拆包处理[^3]: ```javascript // 嵌套数组解构 let [[e], f] = [[1, 2], [3, 4]]; console.log(e); // 输出: 1 console.log(f); // 输出: [3, 4] // 嵌套对象解构 let { user: { id }, settings: { theme }} = { user: { id: 42 }, settings: { theme: 'dark' } }; console.log(id); // 输出: 42 console.log(theme); // 输出: dark ``` 以上例子说明即使面对多级组合型别的资料也可以轻松达成精准定位的效果。 综上所述,ES6 中引入的解构赋值不仅极大地简化了日常编码任务里的常见场景需求,而且背后隐藏着一套严谨且高效的运作流程保障整个功能正常运转的同时还兼顾灵活性考虑各种边界状况妥善应对可能出现的各种意外情形[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值