2014-02-19 2 views
0

Я пытаюсь понять что-то здесь, лучший способ объяснить себе, давая пример:Почему "" == "0" является ложным в javascript?

"" == false 
// true 

"0" == false 
// true 

false == false 
// true 

но что здесь происходит?

"" == "0" 
// false 

Если "" вычисляет false и "0" вычисляет false логика предсказывает, что она такая же, как я пишу false == false.

Я понимаю, что я пытаюсь сравнить две строки здесь, но как язык знает разницу между "a" == "b" или "" == "0"? как в этом случае происходит принуждение?

+11

Вы действуете так, как если бы не было документации по == –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators –

+1

'==' не является транзитивным, a == b' и 'b == c' не означает' a == c'. Алгоритм в spec [** здесь **] (http://es5.github.io/#x11.9.3); Биты, которые вы хотите: Если Type (x) является String, а Type (y) - Number, возвращает результат сравнения ToNumber (x) == y. ** и сравните это с ** Если Type (x) совпадает с типом (y), тогда If Type (x) является String, тогда верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одна и та же символов в соответствующих позициях). В противном случае верните false. –

ответ

12

Почему "" == "0" является ложным в javascript?

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

Похожие вопросы:


Если "" оценивается как ложное и "0" вычисляет false логика предсказывает, что она такая же, как я пишу false == false

Давайте посмотрим, как сравнения фактически решен:

"" == false принуждается к 0 == 0

"0" == false принуждается к 0 == 0

false == false: тот же тип данных, следовательно, значения напрямую сравнение

Как вы можете видеть "0" не «оценивает» значение false, он преобразуется в целое число и сравнивает значение. ("" делает оценку false (пустая строка), но при преобразовании в число это 0).

Существует большая разница между преобразования значение в логическое значение и сравнения значение в булево. Наиболее очевидный пример: !!"0" (true) и "0" == false (true).

Когда вы сравниваете значения разных типов данных со свободным сравнением (==), они всегда привязываются к номерам (или потенциально строки, если вы сравниваете объект со строкой).

Посмотрите на specification для получения дополнительной информации об алгоритме сравнения.

+1

Дополнительно: из спецификации [11.9.3 1.d] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3) – Xotic750

1

Оба операнда рассматриваются как строки (поскольку "" - это строка, "0" также рассматривается как строка), поэтому сравнение возвращает false.

Равно (==)

Если два операнда не одного и того же типа, JavaScript преобразует операнды затем применяет строгое сравнение. Если любой из операндов является числом или логическим, то операнды, если возможно, преобразуются в числа; else , если любой из операндов является строкой, другой операнд, если это возможно, преобразуется в строку . Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, равные, когда операнды ссылаются на на тот же объект в памяти.

С Comparison Operators в Mozilla Developer Network

+0

Можете ли вы указать на ссылку? – dpan

+0

Несомненно, см. [11.9.3 Алгоритм сравнения абстрактного равенства] (http://es5.github.io/#x11.9.3) - это описывает точные правила, которые Феликс следовал в своем ответе. – user2864740

0

Я попытался примеры вы дали и интересная вещь, которую я узнал, что 0 и «» считаются равными ложными. Я знал, что 0 представлено как ложное, но я узнал о «» только сейчас. Благодаря вам. :)

Теперь, что я пытался сравнивать "" == 0, который дал мне правду. Итак, вот что происходит, так как два сравниваемых операнда не одного типа данных, javascript их преобразует (происходит принуждение), и, как вы сами проверяли, и заявили, что они оба являются простыми, то есть false и false == false is true. Но когда вы пытаетесь сравнить «" == "0", причиной двойных кавычек вокруг них они рассматриваются как строки и как строки они не равны, так как их содержимое отличается. Именно по этой причине мы получаем ложь.

Спасибо за вопрос, это было не самое лучшее, но я пробовал и чему-то учил. :)

0

Это связано с тем, что Javascript обрабатывает проверки равенства: вы можете проверить значение с неявным преобразованием типа с помощью == или проверить тип и значение с помощью ===.

Это также означает, что список «falsish» значений оценки для false по сравнению с ==: "", 0, undefined, null

Сейчас: "" == "0" сравнивает две строки, которые явно отличаются.

Беспорядочный вопрос, почему "0" == false?

Это же делать с Javascript spec для ==:

Если два операнда не одного и того же типа, JavaScript преобразует операндов затем применяет строгое сравнение.Если либо операндом является число , либо логическое значение, операнды преобразуются в номера, если возможно; else , если любой из операндов является строкой, другой операнд, если это возможно, преобразуется в строку . Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, равные, когда операнды ссылаются на на тот же объект в памяти.

Если сравнить "0" в булево она сначала преобразуется в число, 0, который является "falsish. Когда вы сравниваете "0" со строкой, строки сравниваются.

Если преобразовать непосредственно (без использования ==), то "0" оценивается как истина:

if("0") console.log('Now "0" is true!') 
+0

* "Это также означает, что список значений фальшивых значений равен false, если сравнивать с ==:" ", 0, undefined, null" * Я был бы очень внимателен к формулировке здесь. Ни одно из этих значений не «оценивает» значение «false» при сравнении. Если они есть, они преобразуются в числа (как вы упомянули позже). И есть даже специальные случаи для 'undefined' и' null' в алгоритме (хотя, они могут быть фактически преобразованы в числа, а также, и в этом случае результатом является «NaN»). –

0

Посмотрите на эту спецификацию,

http://es5.github.io/#x11.9.3

If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false. 

Это все объясняет.

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