js中对象和数组的都是如何解构的

文章详细解释了如何通过Symbol.iterator为Object实现遍历,以及对象解构赋值的工作原理。通过示例展示了forof不能直接遍历Object,但可以通过自定义iterator实现。解构赋值实际上创建了外部变量来接收对象的属性值,而不会影响源对象。同时,文章提到了剩余参数的解构,并解析了Babel编译过程中如何处理此类解构。
摘要由CSDN通过智能技术生成

对象为什么能够解构

 从一道面试题而来

**for of 能否遍历Object,如何遍历?**

我们都知道想遍历对象有2种方式:

1.for in

2.Object.keys()先获取key的数组,然后使用数组遍历方式获取key对应的value

那么for of可以遍历Object吗?

Iterator 是 ES6 提出的接口,为各种数据结构提供统一的访问机制,只要部署了Iterator,就可以遍历。

在Object.prototype上实现一个Symbol.iterator的函数,返回next方法的对象,每次调用next依次返回数据。

    function objectIterator() {

      const keys = Object.keys(this)

      let index = 0

      return {

        next: () => {

          const done = index >= keys.length

          const value = done ? undefined : this[keys[index]]

          index++

          return {

            done, value

          }

        }

      }

    }



    Object.prototype[Symbol.iterator] = objectIterator



    cosnt obj = {name: "xl", age: 28}



    for(let iterator of obj) {

      console.log("iterator", iterator)

    }

深入问题

**对象自身并没有Symbol.iterator方法,为什么对象还能实现解构呢? Set 扩展运算符、解构赋值都是用到Symbol.iterator方法的**

先来看解构

1. 一般常见的解构赋值

    const obj = {name: "xl", age: 28}

    const {name, age} = obj

    说明了啥?解构只是相当于创建一个外部变量name来承接数据"xl",改变外部变量的值并不会影响到源对象的值。

    实际过程:let name = obj.name

2. 携带剩余参数的
   

 const obj = {name: "xl", age: 28, address: "沈阳"}

    const {name, ...res} = obj

    console.log(res) // {age: 28, address: "沈阳"}


    // 具体过程需要看 Babel 的代码编译,下面的文章链接有说明

    function _objectWithoutProperties(source, excluded) {

      if (source == null) return {};

      var target = _objectWithoutPropertiesLoose(source, excluded);

      var key, i;

      if (Object.getOwnPropertySymbols) {

        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);

        console.log(sourceSymbolKeys);

        for (i = 0; i < sourceSymbolKeys.length; i++) {

          key = sourceSymbolKeys[i];

          if (excluded.indexOf(key) >= 0) continue;

          if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;

          target[key] = source[key];

        }

      }

      return target;

    }

    function _objectWithoutPropertiesLoose(source, excluded) {

      if (source == null) return {};

      var target = {};

      var sourceKeys = Object.keys(source);

      var key, i;

      for (i = 0; i < sourceKeys.length; i++) {

        key = sourceKeys[i];

        if (excluded.indexOf(key) >= 0) continue;

        target[key] = source[key];

      }

      console.log(target);

      return target;

    }


    var obj = {

      nickname: 7,

      age: 18,

      address: "西安",

      [Symbol("test")]: "111",

    };


    var nickname = obj.nickname,

      rest = _objectWithoutProperties(obj, ["nickname"]);

总结

数组的解构过程:创建新数组 -> 遍历迭代器 -> 复制属性

对象的解构过程:创建新变量 -> 枚举属性 -> 赋值属性并赋值

参考链接:

面试官:你可以用 for of 遍历 Object 吗?

对象为什么能解构?让我来告诉你😏😏😏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值