Вопрос: влияет ли порядок операндов при оценке равенства или идентичности в 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, который был аннулирован в этой новой версии спецификации?