Какой самый быстрый способ перебора свойств объекта в JavaScript?
Я знаю, что можно перебрать свойства объекта следующим образом:
for (property in object)
{
// делаем что-то
}
Также я знаю, что самым быстрым способом перебора массива в JavaScript является использование убывающего цикла while
:
var i = myArray.length;
while (i--)
{
// делаем что-то быстро
}
Мне интересно, существует ли что-то подобное убывающему циклу while
для перебора свойств объекта.
Правка: просто уточню, что в ответах, касающихся перечисляемости свойств, я не заинтересован.
5 ответ(ов)
Вы можете также использовать Object.getOwnPropertyNames
, чтобы получить ключи объекта.
Вот пример использования:
var obj = {a: "a", b: "b"};
// {a: "a", b: "b"}
var keys = Object.getOwnPropertyNames(obj);
// (2) ["a", "b"]
Эта функция возвращает массив имен всех свойств, включая неизменяемые и не перечисляемые свойства, которые принадлежат объекту. Более подробно можно ознакомиться в документации MDN.
При использовании Object.keys()
в сочетании с традиционным циклом for
для перебора ключей и получения значений, вы получаете лучшую производительность по сравнению с другими методами. Вот всестороннее сравнение производительности:
Цикл for/in
— это лучший способ перечисления свойств объекта в JavaScript. Важно понимать, что этот цикл будет итерировать только по "перечисляемым" свойствам и в произвольном порядке. Не все свойства являются перечисляемыми. Все свойства и методы, добавленные программным способом через ваш собственный код на JavaScript, будут перечисляемыми, однако заранее определенные свойства и методы, которые вы унаследовали (например, toString
), обычно не являются перечисляемыми.
Вы можете проверить перечисляемость свойства следующим образом:
var o = new Object();
alert(o.propertyIsEnumerable("toString"));
Если alert
вернёт false
, это означает, что свойство toString
не является перечисляемым.
В явном использовании Iterator
в JavaScript 1.7+ может быть как выигрыш по производительности, так и потеря. Конечно, это будет итерировать только собственные свойства объекта. Также стоит отметить, что обработка исключения может быть быстрее, если заменить ex instanceof StopIteration
на ex === StopIteration
.
Вот пример кода:
var obj = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6},
iter = new Iterator(obj, true);
while (true) {
try {
doSomethingWithProperty(iter.next());
} catch (ex if (ex instanceof StopIteration)) {
break;
}
}
Такой подход позволит вам эффективно обходить свойства объекта. Не забудьте, что использование ex === StopIteration
может улучшить производительность за счёт упрощения проверки типа исключения. Но следует быть осторожным с совместимостью и работоспособностью кода, особенно если у вас есть специфические сценарии, где важно именно использование instanceof
.
Если вы не знаете названия свойств, то for..in
— хороший способ их перечислить. Если же вы знаете названия, то лучше использовать явное разыменование.
В чем разница между call и apply?
Как эффективно подсчитать количество ключей/свойств объекта в JavaScript
Как лучше всего преобразовать число в строку в JavaScript?
Какова цена использования '$(this)'?
Где найти документацию по форматированию даты в JavaScript?