0

Какой самый быстрый способ перебора свойств объекта в JavaScript?

28

Я знаю, что можно перебрать свойства объекта следующим образом:

for (property in object)
{
    // делаем что-то
}

Также я знаю, что самым быстрым способом перебора массива в JavaScript является использование убывающего цикла while:

var i = myArray.length;
while (i--)
{
    // делаем что-то быстро
}

Мне интересно, существует ли что-то подобное убывающему циклу while для перебора свойств объекта.

Правка: просто уточню, что в ответах, касающихся перечисляемости свойств, я не заинтересован.

5 ответ(ов)

0

Вы можете также использовать Object.getOwnPropertyNames, чтобы получить ключи объекта.

Вот пример использования:

var obj = {a: "a", b: "b"};
// {a: "a", b: "b"}
var keys = Object.getOwnPropertyNames(obj);
// (2) ["a", "b"]

Эта функция возвращает массив имен всех свойств, включая неизменяемые и не перечисляемые свойства, которые принадлежат объекту. Более подробно можно ознакомиться в документации MDN.

0

При использовании Object.keys() в сочетании с традиционным циклом for для перебора ключей и получения значений, вы получаете лучшую производительность по сравнению с другими методами. Вот всестороннее сравнение производительности:

Ссылка на статью

0

Цикл for/in — это лучший способ перечисления свойств объекта в JavaScript. Важно понимать, что этот цикл будет итерировать только по "перечисляемым" свойствам и в произвольном порядке. Не все свойства являются перечисляемыми. Все свойства и методы, добавленные программным способом через ваш собственный код на JavaScript, будут перечисляемыми, однако заранее определенные свойства и методы, которые вы унаследовали (например, toString), обычно не являются перечисляемыми.

Вы можете проверить перечисляемость свойства следующим образом:

var o = new Object();
alert(o.propertyIsEnumerable("toString"));

Если alert вернёт false, это означает, что свойство toString не является перечисляемым.

0

В явном использовании 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.

0

Если вы не знаете названия свойств, то for..in — хороший способ их перечислить. Если же вы знаете названия, то лучше использовать явное разыменование.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь