js对象迭代方法与性能的比较-创新互联

这篇文章主要介绍了js对象迭代方法与性能的比较,具有一定借鉴价值,需要的朋友可以参考下。如下资料是关于javascript对象迭代方法的详细内容。

创新互联公司是一家专注于成都做网站、网站制作与策划设计,桃江网站建设哪家好?创新互联公司做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:桃江等地区。桃江做网站价格咨询:028-86922220

Object.entries


返回对象所有可枚举的键值对,不会追寻原型链上的 key

let obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
Object.entries(obj).forEach(entry => {
  let key = entry[0]
  let value = entry[1]
  // entry 会是这样 ["key1", "value1"]
})

Object.keys


返回对象所有可枚举的键

let obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
Object.keys(obj).forEach(key => {
  let value = obj[key]
})

Object.values


返回对象所有可枚举的值

let obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
Object.values(obj).forEach(value => {
  // 只能使用 value
})

for…in loop


迭代可枚举属性,会顺着原型链找下去

let obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
for (const key in obj) {
  let value = obj[key]
  if (obj.hasOwnProperty(key)) {
    // 本身的
  } else {
    // 来自原型链的
  }
}

Object.getOwnPropertyNames


返回对象所有(包括不可枚举)的键(原文说会找原型链是错的)

let obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
Object.getOwnPropertyNames(obj).forEach(key => {
  let value = obj[key]
})

性能比较


下面的代码用上面的几种方法遍历有 1000000 个属性的对象,循环 10 次

const { PerformanceObserver, performance } = require('perf_hooks')

let objectSize = 1000000
let iterations = 10

console.log(
  'Starting performance test with %d object size and %d iterations',
  objectSize,
  iterations
)

let values = {
  ENTRIES: 0,
  KEYS: 0,
  VALUES: 0,
  FORIN: 0,
  GETOWP: 0,
}

const obs = new PerformanceObserver(items => {
  let entry = items.getEntries()[0]
  console.log(entry.name, entry.duration)
  values[entry.name] += entry.duration
  performance.clearMarks()
})
obs.observe({ entryTypes: ['measure'] })

function generateObject() {
  let obj = {}
  for (let i = 0; i < objectSize; i++) {
    obj['key' + Math.random()] = 'val' + Math.random()
  }
  return obj
}

for (let i = 0; i < iterations; i++) {
  let obj = generateObject()

  //Object.entries
  performance.mark('A')
  Object.entries(obj).forEach(entry => {
    let key = entry[0]
    let value = entry[1]
  })
  performance.mark('B')
  performance.measure('ENTRIES', 'A', 'B')

  //Object.Keys
  performance.mark('A')
  Object.keys(obj).forEach(key => {
    let value = obj[key]
  })
  performance.mark('B')
  performance.measure('KEYS', 'A', 'B')

  //Object.Values
  performance.mark('A')
  Object.values(obj).forEach(value => {})
  performance.mark('B')
  performance.measure('VALUES', 'A', 'B')

  //For In
  performance.mark('A')
  for (const key in obj) {
    let value = obj[key]
  }
  performance.mark('B')
  performance.measure('FORIN', 'A', 'B')

  //Object.getOwnPropertyNames
  performance.mark('A')
  Object.getOwnPropertyNames(obj).forEach(key => {
    let value = obj[key]
  })
  performance.mark('B')
  performance.measure('GETOWP', 'A', 'B')
}

console.log(
  Object.entries(values).sort((a, b) => {
    return a[1] - b[1]
  })
)

下面的结果是我自己跑的,顺序的是指赋值的时候直接用 index,随机则是键值对都插入随机数,得到的性能排序是和作者一样的,也因为 node.js 和 chrome 都是 V8,所以这个应该也是代表在浏览器上的性能排序。

// 顺序
;[
  ['FORIN', 4677.321499],
  ['KEYS', 4812.776572],
  ['GETOWP', 8610.906197],
  ['VALUES', 9914.674390999999],
  ['ENTRIES', 19338.083694],
]

// 随机
;[
  ['KEYS', 4502.579589],
  ['FORIN', 4678.013548000001],
  ['GETOWP', 8880.325031999999],
  ['VALUES', 10104.106962],
  ['ENTRIES', 17089.637588999998],
]

之前听说引擎会猜测下一个值让运行速度更快,看数据似乎没有太大影响。

以上就是js对象迭代方法与性能比较的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注创新互联成都网站设计公司行业资讯!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网页标题:js对象迭代方法与性能的比较-创新互联
分享链接:https://www.cdcxhl.com/article26/jjojg.html

成都网站建设公司_创新互联,为您提供外贸网站建设营销型网站建设全网营销推广品牌网站建设标签优化微信小程序

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网页设计公司