2013-06-01 4 views
1

Я правильно говорю, что это:Является ли '===' более эффективным, чем '! =='?

if (y === x) { 
    //statement a 
} else { 
    //statement b 
} 

является более эффективным, чем это:

if (y !== x) { 
    //statement b 
} else { 
    //statement a 
} 

Примечание: порядок отчетности.

+6

Очень маловероятно, что есть какая-то измеримая разница. Если бы это было так, тогда среда выполнения всегда могла бы обеспечить лучшую логику, независимо от того, как вы ее кодируете. Нет причин тратить время на беспокойство о мелочах, подобных этому. – Pointy

+1

OMG ... Это даже хуже, чем сравнение '++ i' с' i ++ 'или' i + = 1'. Наименее важная микро-оптимизация. – Reinmar

+1

Вы можете попробовать себя: http://jsperf.com/. –

ответ

1

Сначала я скажу «нет», или, по крайней мере, он не может быть надежно решен, поскольку он всегда будет в конечном счете зависимым от реализации.

Сказав это, !== имеет один дополнительный шаг, описанный в спецификации, который должен возвращать противоположность результата сравнения. В противном случае они идентичны.

11.9.4 Строгое Равно Оператор (===)

Производство ВыражениеРавенства: ВыражениеРавенства === ВыражениеОтношения вычисляется следующим образом:

  1. Пусть LRef быть результат вычисления EqualityExpression.
  2. Позвольте lval быть GetValue (lref).
  3. Пусть rref будет результатом оценки RelationalExpression.
  4. Пусть rval будет GetValue (rref).
  5. Вернуть результат выполнения строгого сравнения равенства rval === lval. (См 11.9.6)

11.9.5 Строгого ли-не-равно Operator (==!)

Производственное ВыражениеРавенство: == ВыражениеРавенство вычисляются следующим образом:

  1. Позвольте lref быть результатом оценки EqualityExpression.
  2. Позвольте lval быть GetValue (lref).
  3. Пусть rref будет результатом оценки RelationalExpression.
  4. Пусть rval будет GetValue (rref).
  5. Пусть r является результатом выполнения строгого сравнения равенства rval === lval. (См. 11.9.6)
  6. Если r истинно, верните false. В противном случае верните true.

Я дам вам решить, если этот шаг должен быть беспокойство, но опять же, это только язык спецификация. Кто знает, какие трюки выполняются.

0

=== необходимо сравнить каждый символ двух переменных (если у них более одного), в то время как! == может завершиться довольно быстро, если первые символы не совпадают. Так что! == должно быть немного быстрее, но обычно преимущества настолько малы, что вы их не заметите. Я бы также рекомендовал Пути искать лучшую логику.

+2

Учитывая, что мы говорим о строках, если первые символы не совпадают, они могут остановиться. Если первые символы совпадают, они оба переходят к следующему ... и так далее. Другими словами, сравнение одно и то же. Это просто представление результата, которое отличается. :-) –

+0

моя реализация на самом деле предполагает целочисленное сравнение. например 234 === 0 – Ware

0

Нет. Они очень похожи. Я создал jsfiddle http://jsfiddle.net/rEtjn/

var date1,date2; 
date1=new Date(); 
for(a=1;a<=10000;a++){ 
    if(i===a){ 
     console.log("hello!"); 
    } 
    else{ 
     console.log("bye!"); 
    } 
} 
date2=new Date(); 
alert(date2-date1); 
date1=new Date(); 
for(a=1;a<=10000;a++){ 
    if(i!==a){ 
     console.log("bye"); 
    } 
    else{ 
     console.log("hi!"); 
    } 
} 
date2= new Date(); 
alert(date2-date1); 

Оба запуска в течение 10 миллисекунд друг от друга большую часть времени. Делайте все, что хотите, но они имеют одинаковую скорость.

+0

Я думаю, что это дает хороший ответ на вопрос, следует ли беспокоиться о различиях времени выполнения '===' и '! ==' (НЕТ). Но если вас действительно интересуют эти различия (по какой бы то ни было причине), было бы очень сложно сравнивать, поскольку for-loop (и в вашем случае дополнительные 'console.log's) будут потреблять гораздо больше времени выполнения что невозможно измерить что-либо, даже если есть разница. – basilikum

Смежные вопросы