首页 > 其他分享 >for in 和 for of 是js中常用的遍历方法。但是两者有什么区别呢?

for in 和 for of 是js中常用的遍历方法。但是两者有什么区别呢?

时间:2022-12-01 20:44:18浏览次数:82  
标签:arr 遍历 console log 两者 js let obj

for infor of 是js中常用的遍历方法。但是两者有什么区别呢?
今天我们就来讨论下两者的区别。

遍历数组

  1. for in 是ES5的语法标准,而for of则是ES6语法标准。
const arr = ['a', 'b', 'c']
for(let i in arr){
    console.log(i)
    // '0', '1', '2'
}
for(let i of arr){
    console.log(i)
    // a, b, c
}

通过上述代码我们可以发现for in遍历的是下标,而for of遍历的是属性值
而且。for in所遍历的下标是Strign类型而不是Number类型。

  1. for in 遍历时可以遍历到当前数组的所有属性名和方法名。包括其原型链上定义的属性名和方法名。如下代码:
const arr = ['a', 'b', 'c']
arr.name = 'arr'
arr.getName =  function(){
  return this.name
}
arr.__proto__.constructor.prototype.sayHello = function(){
  return 'hello'
}
arr.__proto__.constructor.prototype.parentName = 'say uncle'
for(let i in arr){
  if(arr.hasOwnProperty(i)){
    console.log('ownProperty',i)
    // '0', '1', '2', 'name', 'getName'
  }else{
    console.log('not ownProperty',i)
    // 'sayHello', 'parentName'
  }
}

而使用for of遍历时则不会遍历原型链上的属性和方法且不会遍历定义在数组上的属性和方法。
代码如下:

const arr = ['a', 'b', 'c']
arr.name = 'arr'
arr.getName =  function(){
  return this.name
}
arr.__proto__.constructor.prototype.sayHello = function(){
  return 'hello'
}
arr.__proto__.constructor.prototype.parentName = 'say uncle'
for(let i of arr){
  console.log(i)
  // 'a', 'b', 'c'
}

遍历对象

  1. 使用for in遍历对象会遍历对象原型链的方法名和属性名,for in 循环实际是为循环可枚举(enumerable)对象而设计的
const obj = {
  name:'uncle',
  gender: 'male',
  age:12,
}
obj.hobby = 'coding'
obj.getName = function(){
  return this.name;
}
obj.__proto__.constructor.prototype.sayHello = function(){
  return "hello"
}
for(let i in obj){
  if(obj.hasOwnProperty(i)){
    console.log('ownProperty',i)
    // name, gender, age, hobby, getName
  }else{
    console.log('not ownProperty',i)
    // sayHello
  }
}

而使用 for of 遍历对象则会报错

for(let i of obj){
  console.log(i)
}
// error Uncaught TypeError: obj is not iterable

这是为什么呢?
这是因为能够被for of正常遍历的数据类型都需要实现一个遍历器Iterator。而数组、字符串、Set、Map结构,早就内置好了Iterator(迭代器),它们的原型中都有一个Symbol.iterator方法,而Object对象并没有实现这个接口,使得它无法被for of遍历。

我们可以通过为Object实现一个Iterator来使Object可以使用正常for of遍历

Object.prototype[Symbol.iterator] = function() {
  let _this = this
  let index = 0
  let length = Object.keys(_this).length
  return {
      next:() => {
          let value = _this[Object.keys(_this)[index]]
          let done = (index >= length)
          index++
          return {value,done}
      }
  }
}

for(let i of obj){
  console.log(i)
}

这样对象就可以使用for of正确遍历啦!



作者:灯下草虫鸣314
链接:https://www.jianshu.com/p/9bbf259c7c38
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:arr,遍历,console,log,两者,js,let,obj
From: https://www.cnblogs.com/xiaoeshuang/p/16942617.html

相关文章

  • 使用Fastjson作为http消息转换器
    主要是创建 FastJsonHttpMessageConverter的实例。@BeanpublicHttpMessageConvertersfastJsonHttpMessageConverters(){//1、定义一个convert转换消......
  • js day04 综合案例秒数计算
    <script>    //用户输入总秒数    letsecond=+prompt('请输入总秒数:')    //计算时分秒    functiongetTime(t){    ......
  • golang的jsonrpc客户端通用写法
    服务端packagemainimport( "errors" "fmt" "log" "net" "net/rpc" "net/rpc/jsonrpc" "os")//算数运算结构体typeArithstruct{}//算数运算请求结......
  • 二叉树前序遍历(python)
    具体做法:step1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。step2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。step3:依次......
  • 二叉树中序遍历(python)
    def inorder(self, list: List[int], root: TreeNode):        # 遇到空节点则返回        if not root:            return ......
  • xml_解析_Jsoup_Document对象与xml_解析_Jsoup_Element对象
    xml_解析_Jsoup_Document对象1.Jsoup:工具类,可以解析html或xml文档,返回Document parse:解析html或xml文档,返回Documentpars......
  • xml_解析_Jsoup_快速入门与xml_解析_Jsoup_Jsoup对象
    xml_解析_Jsoup_快速入门 Jsoup:jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQ......
  • nvm 安装配置 nodejs版本和pnpm 安装和设置
    nvm 安装,下载exe  https://github.com/coreybutler/nvm-windows/releases安装建议设置安装路径其他:  配置nodejs的安装路径: 完成安装之后,可以通过window+R,......
  • vue.config.js --- vue-cli 4.0配置
    //所有配置请参考https://cli.vuejs.org/zh/config/module.exports={/***publicPath*hash模式下可使用*publicPath:process.env.NODE_ENV==='......
  • js 扩展运算符(...)的用法
    在日常开发中,我们在看js代码时,经常会看到(...)这样的符号。这里介绍一下它的含义和作用。定义:扩展运算符(...)是ES6的语法,用于取出参数对象的所有可遍历属性,然后拷贝到当前......