Почему === может иметь странное поведение в Javascript? - PullRequest
1 голос
/ 05 января 2012

Я поднимаю вопрос, как видно из этого урока Академии кодов . Заранее спасибо за ваши объяснения.

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

-------- Объяснение из урока добавлено ниже ----------------

Возможно, вы уже заметили, что мы использовали два типа равных: одно (=) и двойное или тройное (==, ===). Одинарное равенство (=) присваивает переменную, а двойное и тройное равенство (==, ===) используются для проверки эквивалентности значений. Поскольку == может иметь странное поведение в JavaScript, почти всегда лучше использовать ===.

Запустите это упражнение, чтобы увидеть, что оно делает. Сначала он устанавливает переменную word в строку «this». Измените код так, чтобы слово === "that" оценивалось как true, и команда console.log () была выполнена.

Ответы [ 5 ]

6 голосов
/ 05 января 2012

Тройка равна === возвращает значение true, если оба операнда имеют одинаковый тип и имеют одинаковое значение.

Двойное равенство == возвращает значение true, если оба операнда могут быть приведены к одному и тому же типу (следуя определенному набору правил) и иметь одинаковое значение после приведения.

Итак, несколько примеров:

1 === 1       // true
1 === "1"     // false
1 == 1        // true
1 == "1"      // true
"5" == 2 + 3  // true
0 == ""       // true
0 === ""      // false
null == undefined      // true
null === undefined     // false
4 голосов
/ 05 января 2012

Единственные известные мне случаи, когда === имеет "странное поведение", это когда нативное значение (например, string) сравнивается с значением объекта (например,String), которое «конвертируется» в собственное значение:

"a" === "a"                         // true
"a" == new String("a")              // true
"a" === new String("a")             // false- uh, what?
new String("a") == new String("a")  // false- thought it was gonna be true? :)
new String("a") === new String("a") // false
var a = new String("a"); a === a    // true

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

В прошлом были некоторые интересные ошибки браузера, когда определенные методы, например, в String.prototype, возвращали быString, а не string, вызывающий тонкий разрыв кода.

Как отмечали другие, поведение == часто более ... интересно.Я почти исключительно обнаружил, что == делает правильные вещи ™, но понимание деталей важно для овладения JavaScript.

Удачное кодирование.

3 голосов
/ 05 января 2012

== проверяет, являются ли значения эквивалентными. === проверяет, совпадают ли значения.

Чтобы проиллюстрировать этот пример, взгляните на это:

"1" == 1 // this is TRUE, because the values are equivalent.
"1" === 1 // this is FALSE, because the values are of different types.

Мне еще не приходилось сталкиваться со случаем, когда мне нужно === в JavaScript, потому что это сравнительно недавнее дополнение к языку, поэтому, например, indexOf возвращает отрицательное число, означающее "нет совпадения" (тогда как PHP возвращает false, поэтому вы должны использовать === для разграничения между "без совпадения" и "совпадением в начале строки").

3 голосов
/ 05 января 2012

Если две переменные содержат одно и то же значение, но не имеют одинаковый тип, == "заставляет" равенство и возвращает true.Тем не менее, === вернет false, так как требует, чтобы две переменные имели одинаковое значение и одного и того же типа, чтобы быть равными.В противном случае они ведут себя аналогично.

2 голосов
/ 05 января 2012

Я бы очень рекомендовал бы посмотреть эту презентацию Баки Шварц :

В течение первых 5 минут он говорит на эту тему.

Взято с одного из слайдов:

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

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

false == undefined // false
false == null      // false
null  == undefined // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...