Maison > interface Web > js tutoriel > 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
Libérer: 2020-06-10 16:51:46
avant
3097 Les gens l'ont consulté

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"]
})
Copier après la connexion

< sur la chaîne du prototype. 🎜>Object.keys


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

let obj = {
  key1: &#39;value1&#39;,
  key2: &#39;value2&#39;,
  key3: &#39;value3&#39;,
}
Object.keys(obj).forEach(key => {
  let value = obj[key]
})
Copier après la connexion

Object.values


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

let obj = {
  key1: &#39;value1&#39;,
  key2: &#39;value2&#39;,
  key3: &#39;value3&#39;,
}
Object.values(obj).forEach(value => {
  // 只能使用 value
})
Copier après la connexion

for…en boucle


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

let obj = {
  key1: &#39;value1&#39;,
  key2: &#39;value2&#39;,
  key3: &#39;value3&#39;,
}
for (const key in obj) {
  let value = obj[key]
  if (obj.hasOwnProperty(key)) {
    // 本身的
  } else {
    // 来自原型链的
  }
}
Copier après la connexion

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: &#39;value1&#39;,
  key2: &#39;value2&#39;,
  key3: &#39;value3&#39;,
}
Object.getOwnPropertyNames(obj).forEach(key => {
  let value = obj[key]
})
Copier après la connexion

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(&#39;perf_hooks&#39;)

let objectSize = 1000000
let iterations = 10

console.log(
  &#39;Starting performance test with %d object size and %d iterations&#39;,
  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: [&#39;measure&#39;] })

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]
  })
)
Copier après la connexion

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],
]
Copier après la connexion
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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal