2010-09-27 3 views
22

На протяжении многих сторонних библиотек и передовой практики блог/рекомендации и т.д. ... это часто можно увидеть синтаксис вроде этого:В чем причина использования === вместо == с typeof в Javascript?

typeof x === 'object' (instead of typeof x == 'object') 
typeof y === 'string' (instead of typeof x == 'string') 
typeof z === 'function' (instead of typeof x == 'function') 

Если оператор TypeOf уже возвращает строку, что необходимо ввести проверку возвращаемое значение? Если typeof (typeof (x)) всегда строка, независимо от того, что на самом деле x, то == должно быть достаточно, и === не нужно.

При каких обстоятельствах будет typeof не верните строковый литерал? И даже если есть какой-то случайный случай, почему дополнительная проверка типа используется для объекта, строки, функции и т. Д.

+7

Нет никаких обстоятельств. Большинство людей просто смертельно опасаются литья типов по какой-либо причине (* cough * Crockford) – MooGoo

+3

@MooGoo Когда правила кастования типов в JavaScript настолько произвольны, вероятно, хорошо не доверять. – Skilldrick

+0

В этом случае это действительно литье типа? Оператор typeof встроен, а не определен пользователем. Итак, каков реальный риск? –

ответ

19

Чтобы ответить на главный вопрос - нет никакой опасности при использовании typeof с ==. Ниже приведена причина, по которой вы, возможно, захотите использовать ===.


Рекомендация от Crockford, что это безопаснее использовать === во многих случаях, и что, если вы собираетесь использовать его в некоторых случаях лучше быть последовательным и использовать его для всего.

Мысль о том, что вы можете думать о том, использовать ли == или === каждый раз, когда вы проверяете равенство, или вы можете просто привыкнуть всегда писать ===.

Там вряд ли когда-либо причина для использования == над === - если вы по сравнению с true или false и вы хотите принуждения (например, вы хотите 0 или '' оценить в false), то просто использовать if(! empty_str), а не if(empty_str == false).


Для тех, кто не понимают проблем == внешнего контекста TYPEOF см это, из The Good Parts:

'' == '0'   // false 
0 == ''   // true 
0 == '0'   // true 

false == 'false' // false 
false == '0'  // true 

false == undefined // false 
false == null  // false 
null == undefined // true 

' \t\r\n ' == 0 // true 
+2

Нет, это не то, что я спросил: я спрашиваю конкретно, когда вы используете оператор typeof. –

+0

Не должно быть «if (empty_str === false)»;) –

+3

@ Эрик Я знаю, но то, что я говорю, является причиной использования '===' для согласованности с остальной частью вашего кода. – Skilldrick

5

Если оператор TypeOf уже возвращает строки, зачем нужно вводить также проверить возвращаемое значение? Если typeof (typeof (x)) всегда строка, нет вопрос, что на самом деле x, то == должно быть достаточно, а === не нужно.

Это субъективно. Вы можете так же легко обойти это и спросить: «Зачем вам использовать ==, когда вы не ожидаете неявных преобразований?» Оба работают отлично здесь, поэтому используйте тот, который, по вашему мнению, лучше выражает ваше намерение. Старайтесь быть последовательными в рамках проекта.

+1

Спасибо. Кажется, это консенсус до сих пор - стиль над необходимостью. –

0

Тройные равные операторы в основном используются для проверки переменных и значений (все в 1 выражении), также известный как равенство без принуждения типа.

Пример:

var a = 1; 
var b = 1; 
var c = "1"; 
var d = "1"; 

alert (a === b); //True, same value and same type (numeric) 
alert(c === d); //True, same value and same type (string) 
alert(b === c); //False, different type but same value of 1 

См Дуга Крокфорд-х YUI Theater от типа принуждения.


Если оператор TypeOf уже возвращает строку, что необходимо ввести проверить возвращаемое значение, а? Если typeof (typeof (x)) всегда строка, нет вопрос, что на самом деле x, то == должно быть достаточно, а === не нужно.

Самая эффективная причина, по которой не использовать typeof и, скорее, оператор ===, относится к типу принуждения (интерпретации) между браузерами. Некоторые браузеры могут передавать 6=="6" как истинные, а некоторые не будут (в зависимости от строгости интерпретатора JS), поэтому, вводя принуждение типа, это прояснит это. Кроме того, он будет использовать подход Object-Orientativity, поскольку переменные JavasScript не являются переменными типа (т. Е. Типы переменных не объявляются во время компиляции, как в Java).

E.g. в Java это не удастся:

if ("6" instanceof Number) { // false 

Надеюсь, я ответил на ваш вопрос.

+0

Снова - не то, что я просил. –

+0

К сожалению, никогда не читайте ваш вопрос полностью ... обновление .... –

+0

Нет, я спрашиваю конкретно в случаях, связанных с использованием оператора typeof. typeof 6 всегда должен возвращать строковый литерал «number», поэтому проверка типа «typeof 6» никогда не понадобится. –

2

В этом случае нет оснований полагаться на === над ==, так как оба операнда гарантированно являются строками, и поэтому оба оператора дают тот же результат. Поскольку == - это один символ меньше, я бы одобрил это.

Совет Крокфорда в этом случае должен использовать === все время, что является разумным советом для новичка, но бессмысленно параноидальным, если вы знаете проблемы (в других ответах).

+0

Спасибо. Кажется, это консенсус до сих пор - стиль над необходимостью. –

1

Потому что === быстрее ==, из-за отсутствия принуждения типа. Уверен, что это, вероятно, незначительная разница, но она все еще там.

+4

Это не всегда так: если вы посмотрите на шаги, которые каждый оператор должен использовать в спецификации ECMAScript, они фактически идентичны в случае сравнения двух объектов одного типа, таких как две строки. Попробуйте сравнить его. –

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