Перф - це теж причина. Іноді вам може знадобитися перекидання клавіш. Існує кілька способів зробити це
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Зазвичай я використовую так, for of Object.keys()
як це робить правильно, і порівняно коротко, немає необхідності додавати чек.
Але, це набагато повільніше .
Думаю, що причина Object.keys
повільна, очевидна, Object.keys()
має зробити виділення. Насправді AFAIK з цього моменту повинен виділити копію всіх ключів.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
Можливо, двигун JS міг би використовувати якусь незмінну структуру ключів, так що Object.keys(object)
повертає посилання щось, що повторюється над незмінними ключами, і що object.newProp
створює абсолютно новий об’єкт незмінних ключів, але що б там не було, це явно повільніше на 15x
Навіть перевірка hasOwnProperty
- до 2 рази повільніше.
Сенс всього цього полягає в тому, що якщо у вас є чутливий код perf і вам потрібно перебирати клавіші, то ви хочете мати можливість користуватися for in
без необхідності дзвінка hasOwnProperty
. Ви можете це зробити, лише якщо ви не змінили їхObject.prototype
зауважте, що якщо ви використовуєте Object.defineProperty
для зміни прототипу, якщо додані вами речі не перелічені, вони не впливатимуть на поведінку JavaScript у наведених вище випадках. На жаль, принаймні в Chrome 83 вони впливають на продуктивність.
Я додав 3000 незліченних властивостей лише для того, щоб спробувати змусити виникнути будь-які проблеми з парфумом. Маючи лише 30 властивостей, тести були занадто близькими, щоб визначити, чи був вплив на парф.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 і Safari 13.1 не показали різниці в перфірмі між класами Augmented і Unaugmented, можливо, v8 буде виправлено в цій області, і ви можете ігнорувати проблеми з perf.
Але дозвольте також додати, що є історіяArray.prototype.smoosh
. Коротка версія - популярна бібліотека Mootools, зроблена своїми силами Array.prototype.flatten
. Коли комітет зі стандартів спробував додати місцевий, Array.prototype.flatten
вони виявили, що не змогли, не зламаючи багато сайтів. Розробники, які дізналися про перерву, запропонували назвати метод es5 smoosh
як жарт, але люди злякалися, не розуміючи, що це жарт. Вони влаштувалися flat
замістьflatten
Мораль цієї історії полягає в тому, що ви не повинні поширювати рідні предмети. У цьому випадку ви можете зіткнутися з тим самим випуском ваших речей, і якщо ваша бібліотека не настільки популярна, як MooTools, постачальники браузерів навряд чи зможуть обійти проблему, яку ви викликали. Якщо ваша бібліотека набула такої популярності, це було б неначе змусити всіх інших вирішити проблему, яку ви викликали. Тож, будь ласка, не розширюйте рідні об’єкти