В JavaScript существует разница в производительности между использованием double equals (==
) и использованием тройного равенства (===
)?
Пример: if (foo == bar)
vs if (foo === bar)
В JavaScript существует разница в производительности между использованием double equals (==
) и использованием тройного равенства (===
)?
Пример: if (foo == bar)
vs if (foo === bar)
Строгое сравнение (===
) всегда будет немного быстрее, но разница обычно незначительна.
Конечно, имеет смысл предпочесть ===
, если вы точно знаете, что вам не нужно принуждение типа при сравнении. Он всегда будет по крайней мере так же быстро, как ==
.
Если сравниваемые типы одинаковы, они идентичны. То есть они используют тот же самый алгоритм.
Если типы разные, тогда производительность не имеет значения. Либо вам нужно принуждение к типу, либо нет. Если вам это не нужно, не используйте ==
, потому что полученный результат может быть неожиданным.
Изменить: для справки здесь по спецификации доктором Акселем Раушмайером http://www.2ality.com/2011/06/javascript-equality.html Действительно отличная запись.
===
(Строгое равенство): учитывает только значения, имеющие одинаковый тип.
==
(равное равенство)
Во всех современных средах Javascript они реализованы совершенно по-другому. Простыми словами, ==
проверяет alikeness посредством преобразования данных переменных в примитивы (строка, число, логическое значение). ===
тесты для строгого сходства, что означает тот же объект или примитивное значение без преобразования.
Если вы это сделаете
objOne == objTwo
что на самом деле происходит
[[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())
Разрешение значения Of может быть несколько задействовано, перепрыгивая между функциями, открытыми в JS и внутренним движком. Достаточно сказать, что сравнение всегда будет состоять из двух значений, принудительных к примитивному, или ошибка будет выброшена.
Изменить: EQUALS
на самом деле пытается STRICT_EQUALS
сначала, который вытесняет оставшуюся часть процесса.
Интересный бит здесь заключается в том, что valueOf (и его партнер toString) являются переопределяемыми. Запустите этот кусок кода в Chrome (я думаю, что любой веб-кит, не уверенный, что АО и V8 разделяют этот лакомый кусочек). Это взорвет вашу мысль:
var actions = [];
var overload = {
valueOf: function(){
var caller = arguments.callee.caller;
actions.push({
operation: caller.name,
left: caller.arguments[0] === this ? "unknown" : this,
right: caller.arguments[0]
});
return Object.prototype.toString.call(this);
}
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);
Вывод:
[ { operation: 'EQUALS',
left: overload,
right: 10 },
{ operation: 'MUL',
left: overload,
right: 10 },
{ operation: 'DIV',
left: 'unknown',
right: overload },
{ operation: 'IN',
left: overload,
right: DOMWindow },
{ operation: 'UNARY_MINUS',
left: overload,
right: undefined },
{ operation: 'TO_NUMBER',
left: overload,
right: undefined },
{ operation: 'COMPARE',
left: overload,
right: 5 },
{ operation: 'COMPARE',
left: 'unknown',
right: overload },
{ operation: 'ToString',
left: 'unknown',
right: overload } ]
Суть разницы между ==
и ===
проиллюстрирована ===
, которая не отображается в этом списке. Он полностью пропускает путешествие в JavascriptLand. Это приключение дорого стоит при сравнении производительности.
Однако вам нужно учитывать оптимизацию движка. Для большинства объектов двигатель сможет вырезать большую часть шагов и остаться в NativeLand и получить почти такую же производительность. Но это не гарантия, и если что-то мешает движку использовать оптимизацию, некоторую фантазию в вашем коде или переопределение встроенных функций или множество проблем, то вы сразу увидите результат в производительности. ===
принудительно.
===
- это всего лишь единственная непреложная вещь в Javascript.
Из-за производительности я думаю, что ===
имеет лучшую производительность, потому что ===
более строгая, чем ==
,
например. попробуйте выполнить следующие действия в консоли Chrome.
> 1 == '1'
true
> 1 === '1'
false
==
должен проверять больше, чем ===
Из некоторых неосновательных тестов ==
выглядит чуть быстрее, чем ===
.
Вкратце, я имею в виду, что я вижу разницу в несколько миллисекунд на основе многих миллионов тестов. Вы не можете нуждаться в усилении производительности, а не использовать то, что наиболее правильно для этой задачи.
EDIT: на самом деле, похоже, зависит от того, что вы сравниваете, и от реализации браузера. Другими словами, не беспокойтесь об этом.