zoukankan      html  css  js  c++  java
  • for...in和Object.keys的区别

    现有对象obj和空对象copy,想将obj的每一项都复制到copy对象中

    let obj = {
      name:'aaa',
      age: 18
    }
    
    let copy = {}
    
    • 方法1:使用for...in...
    for(let key in obj){
      copy[key] = obj[key]
    }
    console.log(copy)
    

    输出结果:

    • 方法2:使用Object.keys
    Object.keys(obj).forEach(key => {
      copy[key] = obj[key]
    })
    console.log(copy)
    

    输出结果:

    目前看来,两者没什么区别是吧,都能遍历对象,接下来让我们改一下obj,在obj的原型上加个sex属性,再分别使用两种遍历方式

    let obj = {
      name:'aaa',
      age: 18
    }
    
    let copy = {}
    
    obj.__proto__.sex = 1
    
    • 方法1:使用for...in...
    for(let key in obj){
      copy[key] = obj[key]
    }
    console.log(copy)
    

    输出结果:

    可以看到,对象原型上的sex属性也被遍历了

    • 方法2:使用Object.keys
    Object.keys(obj).forEach(key => {
      copy[key] = obj[key]
    })
    console.log(copy)
    

    输出结果:

    可以看到,对象原型上的sex属性没有被遍历,只遍历了对象的自身属性

    所以说,for...in...会遍历对象原型上的属性,而Object.keys只会遍历对象自身的属性,不会去遍历对象原型上的属性

    上述例子,如果依然要使用for...in...来遍历对象,怎么才能避免遍历原型上的属性呢,这里需要使用对象的hasOwnProperty方法

    for(let key in obj){
      if(obj.hasOwnProperty(key)){
        copy[key] = obj[key]
      }
    }
    console.log(copy)
    

    输出结果:

  • 相关阅读:
    最新的Zynq资料整理
    异步FIFO的FPGA实现
    Mac 下安装PHP遇到的问题
    php 实现推技术comet(转)
    高性能分布式内存队列系统beanstalkd(转)
    应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)
    memcache 缓存失效问题(转)
    PHP.ini文件读取不到
    PHP5中魔术方法
    python mysql 单引号字符串过滤
  • 原文地址:https://www.cnblogs.com/zoo-x/p/14847729.html
Copyright © 2011-2022 走看看