Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.05.2018, 12:35
Интересующийся
Отправить личное сообщение для AkezhanOb1 Посмотреть профиль Найти все сообщения от AkezhanOb1
 
Регистрация: 28.09.2017
Сообщений: 20

почему true == "5" возвращает false
если учесть что для сравнения 0, null, undef, NaN, "", false возвращают false, а все остальное true

"6" возвращает true
true == "6" возвращает false почему ??
Ответить с цитированием
  #2 (permalink)  
Старый 08.05.2018, 12:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Потому что при сравнении булева со строкой оба значения в данном случае приводятся к числу.
alert(true == "1 ")

Почему так? ¯\_(ツ)_/¯
Там вообще много странного. Никто на память эту хрень не помнит. Используйте ===.

P.S. К true, если очень надо, можно привести напрямую:
alert(Boolean("6"))
__________________
29375, 35

Последний раз редактировалось Aetae, 08.05.2018 в 12:43.
Ответить с цитированием
  #3 (permalink)  
Старый 08.05.2018, 14:54
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сравнение x === y называется строгим сравнением x и у, и в основном все знают как это работает.

Однако x == y, которое называется абстрактным сравнением x и у, может вызывать непонимание того, почему оно так работает.

Результаты абстрактного сравнения не вычисляются случайным образом, алгоритм абстрактного сравнения описан в спецификации языка JavaScript в пункте 7.2.13.

Такое сравнение производится следующим образом:
  1. Если Type(x) является таким же как Type(y), то
    а. Возвратить результат произведения строго сравнения x === y.
  2. Если x — null и y — undefined, возвратить true.
  3. Если x — undefined и y — null, возвратить true.
  4. Если Type(x) — Number и Type(y) — String, возвратить результат сравнения x == ToNumber(y).
  5. Если Type(x) — String и Type(y) — Number, возвратить результат сравнения ToNumber(x) == y.
  6. Если Type(x) — Boolean, возвратить результат сравнения ToNumber(x) == y.
  7. Если Type(y) — Boolean, возвратить результат сравнения x == ToNumber(y).
  8. Если Type(x) — либо String, либо Number, либо Symbol и Type(y) — Object, возвратить результат сравнения x == ToPrimitive(y).
  9. Если Type(x) — Object и Type(y) — либо String, либо Number, либо Symbol, возвратить результат сравнения ToPrimitive(x) == y.
  10. Возвратить false.

В принципе, если вы сравниваете значения одного типа, то нет разницы — использовать строгое или абстрактное сравнение, результат всегда будет один и тот же.

Почему true == "5" возвращает false?
Вы теперь знаете алгоритм, но всё-же давайте попробуем вычислить это выражение вручную, используя алгоритм абстрактного сравнения:

true == "5" // подходит 6-ой пункт  -> ToNumber(x) == y -> получаем 1 == "5"
1 == "5"    // теперь подходит 4-ый -> x == ToNumber(y) -> получаем 1 == 5
1 == 5      // теперь 1-ый пункт    -> x === y          -> получаем 1 === 5
1 === 5     // по алгоритму строгого сравнения получаем false
false


P. S. Я точно не знаю, но если вы хотели проверить является ли значение конечным числом, то следует использовать функцию Number.isFinite

Последний раз редактировалось Malleys, 08.05.2018 в 14:58.
Ответить с цитированием
  #4 (permalink)  
Старый 08.05.2018, 15:19
Интересующийся
Отправить личное сообщение для AkezhanOb1 Посмотреть профиль Найти все сообщения от AkezhanOb1
 
Регистрация: 28.09.2017
Сообщений: 20

Супер, огромное вам спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему remote не возвращает false? DDim1000 Общие вопросы Javascript 1 28.11.2016 16:13
запрос с callback, почему во второй раз возвращает 2 ответа? sovsem-nub AJAX и COMET 1 01.12.2015 19:52
объясните инициализацию плиз obli jQuery 2 09.02.2015 03:34
Функция не возвращает false, почему? Vitaly jQuery 3 05.07.2009 16:05
Проблема с оперой Ден Opera, Safari и др. 1 22.03.2009 15:49