当前位置: 首页 > article >正文

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

对象为什么能够解构

 从一道面试题而来

**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 吗?

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


http://www.kler.cn/news/17804.html

相关文章:

  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)
  • Java学习之Swing图形界面
  • 关于面试官问Qt Connect的链接方式和类型问题
  • jQuery -- 常用API(下)
  • 《Netty》从零开始学netty源码(五十二)之PoolThreadCache
  • SpringBoot整合FreeMarker
  • 使用zabbix监控Windows指定服务| zabbix Windows service filter
  • 【网络】4万字细品TCP协议
  • yolov8 OpenCV DNN 部署 推理报错
  • 科大版中国版ChatGPT来啦!抢先体验
  • 还能这么玩?清华给 ChatGPT 做逆向,发现了 ChatGPT 的进化轨迹!
  • 记一次产线打印json导致的redis连接超时
  • 【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
  • MySQL高频面试题
  • 多通道振弦传感器无线采集仪通过短信和FTP文件修改参数
  • 设计原则之【接口隔离原则】
  • 22.Java多线程
  • SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack
  • 【Linux】linux进程间通信netlink socket(用户与内核通信)
  • PBDB Data Service:Special parameters(特殊参数)
  • 公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了
  • JAVA原生语言开发多学校Saas模式校园管理系统
  • LT8471IFE#PBF-ASEMI代理亚德诺LT8471IFE#PBF原厂芯片
  • 文件操作和IO
  • 机器视觉工程师,听我一句劝,别去外包,干了三年,废了....对女人没了兴趣
  • 【Unity编辑器】拓展Project视图
  • 复兴号列车司机室
  • Midjourney之logo设计(建议收藏)
  • 杂乱之Android的字体相关类Typeface
  • 一道2023年数学分析真题