Какова эффективность в обозначении Big O оператора in или obj.hasOwnProperty (prop) - PullRequest
6 голосов
/ 16 мая 2011

На веб-сайте Mozilla четко описаны hasOwnProperty() и оператор in.

Однако он не дает никаких подробностей реализации относительно их эффективности.

Я подозреваю, что это будет O(1) (постоянное время), но хотел бы увидеть любые ссылки или тесты, которые могут существовать.

Ответы [ 3 ]

7 голосов
/ 16 мая 2011

Чтобы превратить мои комментарии в ответ.

hasOwnProperty() должен быть O(1), так как это ключевой поиск, но это будет зависеть от реализации.

in, безусловно, будет более сложным (хотя должно быть таким же, как hasOwnProperty(), если свойство существует для этого объекта), когда оно идет вверх по цепочке прототипов, ища это свойство.Вот почему часто рекомендуется использовать hasOwnProperty() при переборе свойств объекта с помощью for ( in ).

Чтобы выяснить это, проверьте исходный код этих функций.Используйте источник, Люк:)

4 голосов
/ 16 мая 2011

Моя теория состояла в том, что in должно быть быстрее, чем hasOwnProperty().in - это прокси для hasProperty() (согласно стандарту: http://www.ecma -international.org / публикации / файлы / ECMA-ST / ECMA-262.pdf - см. Стр. 79), которыйвнутренняя функция, которая широко используется в языке (и неявно будет оптимизирована).Действительно, тесты показывают, что в среднем in быстрее.

Ссылка: http://jsfiddle.net/VhhzR/2/

В Firefox in решительно быстрее.В Chrome in быстрее только при работе со сложным объектом (который озадачивает).В Internet Explorer ведущую роль снова играет in.

Надеюсь, это было полезно:)

0 голосов
/ 16 мая 2011

Я не представляю, что он отличается от механизма поиска свойств объекта, поскольку в действительности они действуют одинаково, разница в том, что hasOwnProperty(prop) смотрит только на сам объект, тогда как o.prop будет идти вниз по иерархии прототипа.

...