for in 和 for of 的区别

1、for...in 循环:只能获得对象的键名,不能获得键值

      for...of 循环:允许遍历获得键值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

var arr = ['red', 'green', 'blue']

for(let item in arr) {

  console.log('for in item', item)

}

/*

  for in item 0

  for in item 1

  for in item 2

*/

for(let item of arr) {

  console.log('for of item', item)

}

/*

  for of item red

  for of item green

  for of item blue

*/

2、对于普通对象,没有部署原生的 iterator 接口,直接使用 for...of 会报错

1

2

3

4

5

6

7

8

9

var obj = {

   'name': 'Jim Green',

   'age': 12

 }

 for(let key of obj) {

   console.log('for of obj', key)

 }

 // Uncaught TypeError: obj is not iterable

可以使用 for...in 循环遍历键名

1

2

3

4

5

6

7

for(let key in obj) {

   console.log('for in key', key)

 }

 /*

   for in key name

   for in key age

 */

也可以使用 Object.keys(obj) 方法将对象的键名生成一个数组,然后遍历这个数组

1

2

3

4

5

6

7

for(let key of Object.keys(obj)) {

   console.log('key', key)

 }

 /*

   key name

   key age

 */

3、for...in 循环不仅遍历数字键名,还会遍历手动添加的其它键,甚至包括原型链上的键。for...of 则不会这样

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

let arr = [1, 2, 3]

arr.set = 'world'  // 手动添加的键

Array.prototype.name = 'hello'  // 原型链上的键

for(let item in arr) {

  console.log('item', item)

}

/*

  item 0

  item 1

  item 2

  item set

  item name

*/

for(let value of arr) {

  console.log('value', value)

}

/*

  value 1

  value 2

  value 3

*/

4、forEach 循环无法中途跳出,break 命令或 return 命令都不能奏效

1

2

3

4

5

6

7

8

9

10

11

12

13

let arr = [1, 2, 3, 5, 9]

arr.forEach(item => {

  if(item % 2 === 0) {

    return

  }

  console.log('item', item)

})

/*

  item 1

  item 3

  item 5

  item 9

*/

for...of 循环可以与break、continue 和 return 配合使用,跳出循环

1

2

3

4

5

6

7

for(let item of arr) {

   if(item % 2 === 0) {

     break

   }

   console.log('item', item)

 }

 // item 1

5、无论是 for...in 还是 for...of 都不能遍历出 Symbol 类型的值,遍历 Symbol 类型的值需要用 Object.getOwnPropertySymbols() 方法

复制代码

{
  let a = Symbol('a')
  let b = Symbol('b')

  let obj = {
    [a]: 'hello',
    [b]: 'world',
    c: 'es6',
    d: 'dom'
  }

  for(let key in obj) {
    console.info(key + ' --> ' + obj[key])
  }

  /*
    c --> es6
    d --> dom
  */

  let objSymbols = Object.getOwnPropertySymbols(obj)
  console.info(objSymbols)    //  [Symbol(a), Symbol(b)]
  objSymbols.forEach(item => {
    console.info(item.toString() + ' --> ' + obj[item])
  })

  /*
    Symbol(a) --> hello
    Symbol(b) --> world
  */

  // Reflect.ownKeys 方法可以返回所有类型的键名,包括常规键名和Symbol键名
  let keyArray = Reflect.ownKeys(obj)
  console.log(keyArray)      //  ["c", "d", Symbol(a), Symbol(b)]
}

总之,for...in 循环主要是为了遍历对象而生,不适用于遍历数组

for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象

js遍历数组的几种方法 

第一种:for循环,也是最常见的

const arr = [11,22,33,44,55,66,77,88]

for (let i = 0; i < arr.length; i++) {
            console.log(arr[i])
        }

第二种:forEach()

 1)、forEach()遍历普通数组

arr.forEach( function(item){
            console.log(item)
        } )

 2)、forEach()遍历对象类型数组

复制代码

const arr = [
            {id:1,name:'zhangsan'},
            {id:2,name:'lisi'},
            {id:3,name:'wangwu'}
        ]

arr.forEach( function(item){
            console.log(item.id + '---' +  item.name)
        })

复制代码

输出结果:

第三种: map()方法

map即是 “映射”的意思 ,原数组被“映射”成对应新数组

复制代码

var newArr = arr.map( function(value,index){
    console.log(value + '---' + index)
    return value + 10
})

console.log(newArr)

复制代码

输出结果:

注意:forEach()和map()区别:

1、forEach:用来遍历数组中的每一项,这个方法执行没有返回值,不影响原数组

2、map:支持return,相当与原数组克隆了一份,把克隆的每项改变了,也不影响原数组

第四种: for....in   方法

for....in 是es5标准, 此方法遍历数组效率低,主要是用来循环遍历对象的属性

1)、 for......in  遍历数组

for(let item in arr){
            console.log(arr[item])
        }

2)、for.....in 遍历对象

循环遍历对象的属性,js中动态获取key,得到某对象中相对应的value = obj[key]

复制代码

const obj = {
            a:1,
            b:2,
            c:3
        }

for(let key in obj){
            console.log(key + '---' + obj[key] )
        }

复制代码

输出结果:

第五种: for.......of    方法    (es6支持)

for(let item of arr){
            console.log(item)
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 中,for...in 和 for...of 是两种循环语句,用于迭代数组或对象的元素。它们的用法和行为有一些区别。 1. for...in 循环: for...in 循环用于迭代对象的可枚举属性。它会遍历对象的所有可枚举属性,包括自身的属性和继承的属性。语法如下: ```javascript for (variable in object) { // 循环体 } ``` 在循环体中,你可以通过 variable 获取到当前迭代的属性名。 示例: ```javascript const obj = { a: 1, b: 2, c: 3 }; for (let key in obj) { console.log(key); // 输出属性名:a, b, c console.log(obj[key]); // 输出属性值:1, 2, 3 } ``` 2. for...of 循环: for...of 循环用于迭代可迭代对象(如数组、字符串、Set、Map等)的元素值。它会遍历对象的可迭代部分,而不包括对象的属性。语法如下: ```javascript for (variable of iterable) { // 循环体 } ``` 在循环体中,你可以通过 variable 获取到当前迭代的元素值。 示例: ```javascript const arr = [1, 2, 3]; for (let value of arr) { console.log(value); // 输出元素值:1, 2, 3 } const str = "Hello"; for (let char of str) { console.log(char); // 输出字符:H, e, l, l, o } ``` 总结: - for...in 循环用于迭代对象的属性名,可以遍历对象的可枚举属性。 - for...of 循环用于迭代可迭代对象的元素值,可以遍历数组、字符串等可迭代对象。 希望这个解答对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值