Подтвердить что ты не робот

Какая причина использовать === вместо == с 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, то == должно быть достаточно, а === не нужно.

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

4b9b3361

Ответ 1

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


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

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

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


Для тех, кто не понимает проблемы == вне контекста typeof, см. это из Хорошие части:

'' == '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 уже возвращается строка, что нужно вводить проверить возвращаемое значение? Если typeof (typeof (x)) всегда строка, no вопрос, что на самом деле x, тогда == должно быть достаточно и === нет необходимости.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Тройные равные операторы в основном используются для проверки переменных и значений (все в 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

См. Doug Crockford YUI Theatre по типу принуждения.


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

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

например. в Java это не получится:

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

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