ES6结构赋值

// 解构赋值

        // 1.数组
        var a, b, c
        [a, b, c] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log(a, b, c);// 1 , 2 , 3
        [d, e, ...f] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log(d, e, f); // 1  2  3-9
        // 函数返回数组结构
        function arrreturn() {
            return [10, 20, 30, 40]
        }
        [arritem1, arritem2, arritem3, arritem4] = arrreturn()
        console.log(arritem1, arritem2, arritem3, arritem4); //10 20 30 40
        // 解构赋值数组的默认值
        [defa1 = 1, defa2 = 2, defa3 = 3] = [10]
        console.log(defa1, defa2, defa3); //10 2 3 可以使用等于号进行设置默认值,如果有解构赋的值,那么默认值不生效



        // 2.对象
        ({ name, age } = { name: '张三', age: 25 })
        console.log(name, age); //张三  25

        ({ name, age, ...surplus } = { age: 25, name: '李四', color: 'yellow', fruits: 'apple' })
        console.log(name, age, surplus);//李四 25 {color: 'yellow', fruits: 'apple'}

        var obj = { obja: 1, objb: 2 }
        var { obja: objaContent, objb: objbContent } = obj
        console.log(objaContent, objbContent);  //1 2


        // for of 迭代解构
        var people = [
            {
                name: 'Mike Smith',
                family: {
                    mother: 'Jane Smith',
                    father: 'Harry Smith',
                    sister: 'Samantha Smith'
                },
                age: 35
            },
            {
                name: 'Tom Jones',
                family: {
                    mother: 'Norah Jones',
                    father: 'Richard Jones',
                    brother: 'Howard Jones'
                },
                age: 25
            }
        ];
        for(var {name:n,family:{mother:m,father:f}} of people){
            console.log('my:'+n,'mother:'+m,'father:'+f);
        }
### 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].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值