for in 适用于可枚举数据,例如对象,数组,字符串。
for of 适用于可迭代数据,例如Array,String,Map,Set,函数的arguments对象,NodeList对象。
简单来说它们都是用来遍历属性。
- 可枚举 属性enumerable的值为true,通过Object.getOwnPropertyDescriptors()查看
- 可迭代
- 具有symbol.iterator属性,它对应得值是一个函数,调用这个函数可以得到一个对象,每次调用对象得next方法能得到目标得每一项。
for in 得到的是(索引值)key。
for in 原型上的可枚举属性能被遍历到。
如果不想遍历原型方法和属性的话,可以使用hasOwnProperty()方法可以判断某属性是不是该对象的实例属性
Array.prototype.foo = 4
const arr = [1,2]
for(const item in arr) {
console.log(arr[item]); //1,2,4
}
for(const item in arr) {
if(arr.hasOwnProperty(item)) {
console.log(arr[item]); //1,2
}
}
for of 一般得到的是value。
for of 一般只能遍历自身。
Array.prototype.foo = 4
const arr = [1,2]
for(const item of arr) {
console.log(item); //1,2
}
for of 遍历对象,可以使用Object.keys()方法。也可以使用for in循环。
var obj = {
name:'zark',
age:2,
}
for (var key of Object.keys(obj)) {
console.log(obj[key]); //zark 2
}