В 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: на самом деле, похоже, зависит от того, что вы сравниваете, и от реализации браузера. Другими словами, не беспокойтесь об этом.