Имеет ли значение порядок операндов при оценке равенства или идентичности в JavaScript? - PullRequest
5 голосов
/ 21 января 2012

Вопрос: влияет ли порядок операндов при оценке равенства или идентичности в JavaScript?

В коде (0 == value) быстрее или правильнее, чем (value == 0)? (Обратите внимание, что этот вопрос одинаково действителен для оператора тождества, ===.)

Поскольку операторы равенства и тождества являются коммутативными, я не верю, что порядок операндов должен иметь значение в производительности оценки, если только не существует неотъемлемого преимущества левого литерала в вычислении самого алгоритма равенства. Единственная причина, по которой меня интересует, - это то, что я недавно использовал Google Closure Compiler , чтобы свести к минимуму JavaScript, и заметил, что

if (array.length == 0 && typeof length === 'number') {

был скомпилирован в

if(0 == b.length && "number" === typeof c) {.

В обоих выражениях равенства - одном свободном и одном строгом - Closure изменил порядок моих операндов, поместив литерал Number и String слева от соответствующих им выражений.

Это сделало меня любопытным.

Я прочитал раздел Операторы равенства спецификации языка ECMAScript 5.1 (раздел 11.9, с. 80–82) и обнаружил, что хотя алгоритмы равенства начинаются с изучения левого - сначала операнды, нет никаких указаний на то, что литерал быстрее или лучше использовать в качестве этого операнда.

Есть ли что-то в проверке типов в ECMAScript, которая делает проверку литералов оптимальной? Может ли быть какая-то особенность оптимизации в компиляторе Closure? Или, может быть, подробности реализации в более старой версии алгоритма равенства ECMAScript, который был аннулирован в этой новой версии спецификации?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Многие люди пишут код с переменной справа, как соглашение о стиле. Основная причина, по которой он может отлавливать ошибки при небрежном кодировании.

Следующий код, скорее всего, ошибка, но оператор if будет иметь значение true.

if( n = 1 ) { }

и это выдаст ошибку

if( 1 = n ) { }
1 голос
/ 21 января 2012

http://jsperf.com/lr-equality

Я не могу дать вам объяснение, но вы можете проверить цифры. Кажется, они равны (сейчас).

...