Maison  >  Article  >  interface Web  >  Comparaison des méthodes d'itération et des performances des objets JavaScript

Comparaison des méthodes d'itération et des performances des objets JavaScript

hzc
hzcavant
2020-06-10 16:51:463061parcourir

Object.entries


renvoie toutes les 可枚举 paires clé-valeur de l'objet et ne suivra pas le 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


Renvoie toutes les clés énumérables de l'objet

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

Object.values


Renvoyer toutes les valeurs énumérables de l'objet

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

for…en boucle


Itérer les propriétés énumérables et rechercher le long de la chaîne de prototypes

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

Object.getOwnPropertyNames


Renvoie toutes les clés (y compris non énumérables) de l'objet (le texte original disait qu'il recherchera la chaîne de prototypes est faux)

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

Comparaison des performances


Le code suivant utilise les méthodes ci-dessus pour parcourir des objets avec 1 000 000 d'attributs et des boucles 10 fois

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[&#39;key&#39; + Math.random()] = &#39;val&#39; + Math.random()
  }
  return obj
}

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

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

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

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

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

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

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

Les résultats suivants sont ceux que j'ai exécutés moi-même. Séquentiel signifie utiliser l'index directement lors de l'attribution de valeurs. Random signifie insérer des nombres aléatoires dans des paires clé-valeur. Le classement des performances obtenu est le même que celui de l'auteur. V8, cela devrait être Cela représente également le classement des performances sur le navigateur.

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

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

J'ai déjà entendu dire que le moteur devinerait la valeur suivante pour le faire fonctionner plus rapidement. En regardant les données, cela ne semble pas avoir beaucoup d'impact.

C'est aussi un peu d'informations utiles, venez nombreux au texte original applaudir l'auteur

Tutoriel recommandé : "

Tutoriel JS"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer