for in 和 for of 的区别
在对数组或对象进行遍历时,我们经常会使用到两种方法: for in
和for of
,那么这两种方法之间的区别是什么呢?让我们来研究研究
简单来说就是它们两者都可以用于遍历,不过for in
遍历的是数组的索引(index
),而for of
遍历的是数组元素值(value
)
// for in
var obj = {a:1, b:2, c:3}
for (let key in obj) {
console.log(key)
}
// a b c
//for of
const array1 = ['a', 'b', 'c']
for (const val of array1) {
console.log(val)
}
// a b c
复制代码
先说说 for in
for in
更适合遍历对象,当然也可以遍历数组,但是会存在一些问题,
比如:
index
索引为字符串型数字,不能直接进行几何运算
var arr = [1,2,3]
for (let index in arr) {
let res = index + 1
console.log(res)
}
//01 11 21
复制代码
遍历顺序有可能不是按照实际数组的内部顺序
使用for in
会遍历数组所有的可枚举属性,包括原型,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,使用hasOwnProperty()
方法可以判断某属性是不是该对象的实例属性
var arr = [1,2,3]
Array.prototype.a = 123
for (let index in arr) {
let res = arr[index]
console.log(res)
}
//1 2 3 123
for(let index in arr) {
if(arr.hasOwnProperty(index)){
let res = arr[index]
console.log(res)
}
}
// 1 2 3
复制代码
再来说说ES6 中的 for of
for of
遍历的是数组元素值,而且for of
遍历的只是数组内的元素,不包括原型属性和索引
var arr = [1,2,3]
arr.a = 123
Array.prototype.a = 123
for (let value of arr) {
console.log(value)
}
//1 2 3
复制代码
for of
适用遍历数/数组对象/字符串/map
/set
等拥有迭代器对象(iterator
)的集合,但是不能遍历对象,因为没有迭代器对象,但如果想遍历对象的属性,你可以用for in
循环(这也是它的本职工作)或用内建的Object.keys()
方法
var myObject={
a:1,
b:2,
c:3
}
for (var key of Object.keys(myObject)) {
console.log(key + ": " + myObject[key]);
}
//a:1 b:2 c:3
复制代码
小结
for in
遍历的是数组的索引(即键名),而for of
遍历的是数组元素值
for in
总是得到对象的key
或数组、字符串的下标
for of
总是得到对象的value
或数组、字符串的值
了解更多前端培训技术知识欢迎关注小编!