for in和for of的区别

这篇具有很好参考价值的文章主要介绍了for in和for of的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

for in

for in 使用于可枚举的数据 如 对象 数组 字符串
什么是可枚举的:属性的enumerable值为true,表示可枚举
可以通过es7新增的属性 Object.getOwnPropertyDescriptors()验证 查看
Object.getOwnPropertyDescriptor() 方法用于 返回 指定 对象 上一个自有 属性 对应的属性描述符

// 通过Object.getOwnPropertyDescriptors()
const a = [1, 23, 3]
console.log(Object.getOwnPropertyDescriptors(a));
const b = { a: 1, b: 2 }
console.log(Object.getOwnPropertyDescriptors(b));
const c = 'string'
console.log(Object.getOwnPropertyDescriptors(c));

看下图打印的信息,enumerable值为true表示都是可迭代对象
for in和for of的区别
for in 不仅能便利自身的属性,他还能便利原型链上可枚举的属性
他返回的是key的值,并且不能保证顺序

let a = [1,2,3]
Array.prototype.num = 4
for(let i in a){
  console.log(i) // 0,1,2,num
  console.log(a[i]) // 1,2,3,4
}
// 他返回的是value的值 
for(let j of a){
  console.log(j) //  1,2,3
}

for of

for of 适用于可迭代数据
什么是可迭代数据 :在原型链上具有Symbol.iterator属性,通过调用.next() 方法,返回对应的属性
可迭代数据:array string Map Set 函数的arguments对象 还有我们的生成器函数function*( ){ }

	const a = [1,2,3]
	//a.prototype上有这么一个属性 Symbol(Symbol.iterator):ƒ values() 表示可迭代的
	同理 string Map Set 这些原型上都有这个属性 

for of 只能便利自身的属性
他得到的是value 具体和迭代器的内部实现有关文章来源地址https://www.toymoban.com/news/detail-470988.html

const arr = [1, 2, 3]
arr[Symbol.iterator] = function () {
  const that = this
  return {
    i: 0,
    next() {
      // 正常的 通过 for of 返回value
      return this.i < that.length ? { value: that[this.i++], done: false } : { value: undefined, done: true }
    }
  }
}

for (let i of arr) {
  console.log(i); // 1,2,3
}

// 改写Symbol.iterator的next方法
arr[Symbol.iterator] = function () {
  const that = this
  return {
    i: 0,
    next() {
      // 通过改写之后 for of也能返回key
      return this.i < that.length ? { value: this.i++, done: false } : { value: undefined, done: true } 
    }
  }
}

for (let i of arr) {
  console.log(i); // 0,1,2 输出的是key
}

到了这里,关于for in和for of的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 2496. Maximum Value of a String in an Array【字符串,数组】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月11日
    浏览(57)
  • 你理解了for-in 和 for-of 吗?他们有什么区别?

    【前言】 在 JavaScript 中,for 循环语句是编写复杂程序时经常使用的一种工具。其中,for-in 和 for-of 是两个最常用的变体。尽管这两者非常相似,但它们在迭代对象方面有所不同。在本文中,我们将探讨 for-in 和 for-of 的不同之处,以及如何正确使用它们。 【正文】 一、for-

    2024年02月09日
    浏览(35)
  • Kotlin基础——枚举、When、in、for

    声明只有值的枚举 此外还可以增加属性和方法, 如果需要在枚举类中定义方法,要使用分号把枚举常量列表和方法定义分开 ,这也是Kotlin唯一必须使用分号的地方 可使用多行表达式函数体 上面只会匹配对应分支, 如果需要多个值合并,则使用逗号隔开 when可以使用任何对

    2024年02月06日
    浏览(40)
  • 【每日一题Day217】LC2451差值数组不同的字符串 | 枚举+变量记录

    给你一个字符串数组 words ,每一个字符串长度都相同,令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] ,其中对于 0 = j = n - 2 有 difference[i][j] = words[i][j+1] - words[i][j] 。注意两个字母的差值定义为它们在字母表中 位置

    2024年02月07日
    浏览(45)
  • Integer.valueOf()用于字符和字符串的区别

    LeetCode 17 电话号码的字母组合 先贴代码 踩坑: 1、假设digits = \\\"23\\\",deepfloor = 0。 如果num =  Integer.valueOf(digits.charAt(deepfloor));  num=50,这是为什么呢,因为digits.charAt(deepfloor)=\\\'2\\\',对应的ASCII值为50... 而 num =  Integer.valueOf(digits.substring(deepfloor,deepfloor+1)); num=2,才能得到正确结果

    2024年02月07日
    浏览(26)
  • JS中的for in和for of

    在JavaScript中, for...in 和 for...of 都是用于迭代循环的结构:   1. for...in 循环: for...in 循环主要用于遍历对象的可枚举属性。这种循环不仅遍历对象自身的属性,还会遍历原型链上的可枚举属性。它的语法如下: 其中 variable 是属性名, object 是要遍历的对象。 注意:虽然 f

    2023年04月20日
    浏览(55)
  • jquery和php json字符串转数组对象 和 数组对象转json字符串

    要实现从对象转换为 JSON 字符串,使用 JSON.stringify( ) 方法: 要实现从 JSON 转换为对象,使用 JSON.parse() 方法: 数组变字符串 字符串变数组 json转数组   json_decode(  string $json ,  bool $assoc = false ,  int $depth = 512 ,  int $options = 0 ) $json:待解码的 json string 格式的字符串。这个函数

    2024年02月13日
    浏览(113)
  • js中的内置对象、数学对象、日期对象、数组对象、字符串对象

    car、computer div、p window、console 数学对象 Math (object类型) 1、圆周率 Math.PI 2、向下取整(返回值) Math.floor() 3、向上取整(返回值) Math.ceil() 4、四舍五入 Math.round() 5、随机数 0x1 Math.random() 6、绝对值 Math.abs() 7、最大值 Math.max() 8、最小值 Math.min() 9、指数幂 Math.pow(底数,指数) 10、平

    2024年01月24日
    浏览(42)
  • 如何将JSON字符串数组转对象集合

    1、、、引入jar 包 2、Java对象转成JSON格式 3、JSON格式字符串转换成Java对象 3.1、直接将JSON字符串转换成Java对象 3.2、先将JSON字符串转换成JSON对象,再转换成Java对象 3.3、如果JSON字符串是一个JSON数组,并且数组里面存放的同一种类型的对象,可以将这个JSON数组转换成Java的Li

    2024年02月02日
    浏览(61)
  • 【Java 数组与对象】数组对象和对象数组的区别(127)

    数组对象 :(对象里面属性包含数组)本质是对象,即一个数组对象,该数组里面存储的数据类型可以是各种数据类型; 对象数组 :(数组里面元素包含对象)对象数组是指数组元素是对象的数组:是由一组对象引用组成的数组; 测试案例: Person 对象: Car对象: 测试D

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包