四时宝库

程序员的知识宝库

JavaScript中,for in 和for of的区别

目录:我们在循环遍历数组或者对象的时候都会用到for in (es5)和for of(es6);在使用上感觉效果都差不多;那他们到底有什么差别呢?那我们就通过代码的方式来验证他们的不同吧!

数组

    var arr = ['A','B','C']
    
    for(var key in arr){
        console.log(arr); // 输出结果  ["A", "B", "C"]
        console.log(key); // 输出结果 0 1 2
    }

    for(var i of arr){
        console.log(arr); // 输出结果 [ 'A', 'B', 'C' ]
        console.log(i); // 输出结果 A B C
    }

对象

var obj = {
    id:1,
    name:'张三'
}

for(var key in obj){
    console.log(key); // 输出结果 id name
    console.log(obj); // 输出结果 { id: 1, name: '张三' } { id: 1, name: '张三' }
}

for(var i of obj) {
    console.log(i); // 输出结果 obj is not iterable (obj不是可迭代的)
}

for(var i of Object.keys(obj)) {
    console.log(i); // id name
    console.log(obj); // {id: 1, name: "张三"} {id: 1, name: "张三"}
}

原型链/继承-数组

     var arr = ['A','B','C']
     
    Object.prototype.test = function() {}; 
    Array.prototype.item = function() {};
    
    for(var key in arr){
        console.log(arr); // 输出结果 [ 'A', 'B', 'C' ]
        console.log(key); // 输出结果 0 1 2 item test
    }
    for(var key in arr){
        if(arr.hasOwnProperty(key)){
          console.log(arr); // 输出结果 [ 'A', 'B', 'C' ]
            console.log(key); // 输出结果 0 1 2
        }
    }

    for(var i of arr){
        console.log(arr); // 输出结果 [ 'A', 'B', 'C' ]
        console.log(i); // 输出结果 A B C
    }

原型链/继承-对象

var obj = {
    id:1,
    name:'张三'
}
     
Object.prototype.test = function() {}; 
Array.prototype.item = function() {};

for(var key in obj){
    console.log(obj); // 输出结果 { id: 1, name: '张三' } { id: 1, name: '张三' } { id: 1, name: '张三' }
    console.log(key); // 输出结果 id name test
}
for(var key in obj){
    if(obj.hasOwnProperty(key)){ // 检查
        console.log(key); // 输出结果 id name
        console.log(obj); // 输出结果 { id: 1, name: '张三' }
    }
}

for(var i of obj){
    console.log(i); // 输出结果 obj is not iterable
}
for(var i of Object.keys(obj)){
    console.log(i); // 输出结果 id name
}

for...in 循环的是可迭代对象key的值,而for...of 循环的是可迭代对象value的值,由此可见在面对普通对象的时候推荐使用for...in;如果就是喜欢用for of 的话就需要使用Object.keys(obj);还有就是继承和原型链的原因会导致对象 arr 继承item和test;所以在使用的时候可以用 obj.hasOwnProperty() 来检查一下,避免导致不需要的状态发生;

如果有什么不对的地方;欢迎大家补充;相互学习、共勉

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接