• 为什么不建议用for in遍历数组 吴小明


    for...in本身是Object的遍历方法,js中的数组也继承自Object,所以也能够使用for...in遍历出属性。然而for...in遍历数组时有一些细节需要注意。

    1、for...in遍历的属性是字符串,而不是数字

          const arr = [1, 2, 3]
          for (const i in arr) {
            console.log(i, typeof i)
          }

      打印结果:

        

    2、for...in遍历的是对象的可枚举属性,包括原型链上的属性

          const obj = { a: 'a', b: 'b' }
    
          Object.prototype.c = 'c'
    
          Object.defineProperty(obj, 'd', {
            value: 'd',
            enumerable: true // enumerable默认值为false,设置为true时可以被for...in遍历到
          })
    
          for (const i in obj) {
            console.log(i, obj[i])
          }

      打印结果:defineProperty中enumerable的默认值是false,for...in遍历不到,如果设置为true即可被for...in遍历到

        

    3、遍历的顺序是对象属性的枚举顺序,不是按照数组的下标顺序遍历

      如果需要按照索引顺序去遍历,不要使用for...in去遍历,而应该使用for...of或者for循环、forEach等方法。

      此外,因为有稀疏数组的存在,其实JS里的数组不一定是顺序结构存储的。当数组的键分布较为稀疏,为了充分节约空间,数组可能会退化为像对象一样的哈希表存储结构。

  • 相关阅读:
    AtCoder Grand Contest 019
    upd 2020.10.31
    ubuntu 自动配置脚本
    linux下gcc、g++不同版本的安装和切换
    fixes for 100% disk usage on Windows 10
    简单聊聊VisualStudio的断点调试
    运算符重载
    设计模式之桥接模式
    使用C#进行数据库增删改查ADO.NET(三)
    使用C#进行数据库增删改查ADO.NET(二)
  • 原文地址:https://www.cnblogs.com/wuqilang/p/16298592.html
Copyright © 2020-2023  润新知