Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Операторы сравнения и логические значения кратко

Лекция



Привет, сегодня поговорим про операторы сравнения, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое операторы сравнения, логические значения, truthy, falsy , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).

  1. логические значения
  2. Сравнение строк
  3. Сравнение разных типов
  4. Строгое равенство
  5. Сравнение с null и undefined
  6. Итого

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

Многие операторы сравнения знакомы нам со школы:

  • Больше/меньше: a > b, a < b.
  • Больше/меньше или равно: a >= b, a <= b.
  • Равно a == b.
    Для сравнения используется два символа равенства '='. Один символ a = b означал бы присваивание.
  • «Не равно». В школе он пишется как , в JavaScript — знак равенства с восклицательным знаком перед ним !=.

Логические значения

Как и другие операторы, сравнение возвращает значение. Это значение имеет специальныйлогический тип.

Существует всего два логических значения:

  • true — имеет смысл «да», «верно», «истина».
  • false — означает «нет», «неверно», «ложь».

Например:

1 alert( 2 > 1 ); // true, верно
2 alert( 2 == 1 ); // false, неверно
3 alert( 2 != 1 ); // true

Логические значения можно использовать и напрямую, присваивать переменным, работать с ними как с любыми другими:

1 var a = true; // присвоили явно
2 var b = 3 > 4; // false
3
4 alert( b ); // false
5
6 alert( a == b ); // (true == false) неверно, результат false

Сравнение строк

Строки сравниваются побуквенно:

1 alert( 'Б' > 'А' ); // true

Буквы сравниваются в алфавитном порядке. Какая буква в алфавите позже — та и больше.

Кодировка Unicode

Аналогом «алфавита» во внутреннем представлении строк служит кодировка, у каждого символа — свой номер (код). JavaScript использует кодировку Unicode. При этом сравниваются численные коды символов.

В кодировке Unicode обычно код у строчной буквы больше, чем у прописной, поэтому:

1 alert('а' > 'Я'); // true, строчные буквы больше прописных

Для корректного сравнения символы должны быть в одинаковом регистре.

Сравнение осуществляется как в телефонной книжке или в словаре. Об этом говорит сайт https://intellect.icu . Сначала сравниваются первые буквы, потом вторые, и так далее, пока одна не будет больше другой.

Иными словами, больше — та строка, которая в телефонной книге была бы на большей странице.

Например:

  • Если первая буква одной строки больше — значит первая строка больше, независимо от остальных символов:

    1 alert( 'Банан' > 'Аят' );

  • Если одинаковы — сравнение идет дальше. Здесь оно дойдет до третьей буквы:

    1 alert( 'Вася' > 'Ваня' ); // true, т.к. 'с' > 'н'

  • При этом любая буква больше отсутствия буквы:
    1 alert( 'Привет' > 'Прив' ); // true, так как 'е' больше чем "ничего".

Такое сравнение называется лексикографическим.

Обычно мы получаем значения от посетителя в виде строк. Например, promptвозвращает строку, которую ввел посетитель.

Числа, полученные таким образом, в виде строк сравнивать нельзя, результат будет неверен. Например:

1 alert( "2" > "14" ); // true, неверно, ведь 2 не больше 14

В примере выше 2 оказалось больше 14, потому что строки сравниваются посимвольно, а первый символ '2' больше '1'.

Правильно было бы преобразовать их к числу явным образом. Например, поставив перед ними +:

1 alert( +"2" > +"14" ); // false, теперь правильно

Сравнение разных типов

При сравнении значения преобразуются к числам. Исключение: когда оба значения — строки, тогда не преобразуются.

Например:

1 alert( '2' > 1 ); // true
2 alert( '01' == 1 ); //true
3 alert( false == 0 ); // true, false становится 0, а true 1.

Тема преобразований типов будет продолжена далее, в главе Преобразование объектов: toString и valueOf.

Строгое равенство

Обычное равенство не может отличить 0 от false:

1 alert(0 == false); // true, т.к. false преобразуется к 0

Что же делать, если все же нужно отличить 0 от false?

Для проверки равенства без преобразования типов используются операторы строгого равенства === (тройное равно) и !==.

Они сравнивают без приведения типов. Если тип разный, то такие значения всегда неравны (строго):

1 alert(0 === false); // false, т.к. типы различны

Сравнение с null и undefined

Проблемы со специальными значениями возможны, когда к переменной применяется операция сравнения > < <= >=, а у нее может быть как численное значение, так и null/undefined.

Интуитивно кажется, что null/undefined эквивалентны нулю, но это не так! Они ведут себя по-другому.

  1. Значения null и undefined равны == друг другу и не равны чему бы то ни было еще.
    Это жесткое правило буквально прописано в спецификации языка.
  2. При преобразовании в число null становится 0, а undefined становится NaN.

Посмотрим забавные следствия.

Некорректный результат сравнения null с 0

Сравним null с нулем:

1 alert(null > 0); // false
2 alert(null == 0); // false

Итак, мы получили, что null не больше и не равен нулю. А теперь…

1 alert(null >= 0); // true

Как такое возможно? Если нечто «больше или равно нулю», то резонно полагать, что оно либо больше, либо равно. Но здесь это не так.

Дело в том, что алгоритмы проверки равенства == и сравнения >= > < <= работают по-разному.

Сравнение честно приводит к числу, получается ноль. А при проверке равенства значения null и undefined обрабатываются особым образом: они равны друг другу, но не равны чему-то еще.

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

Несравнимый undefined

Значение undefined вообще нельзя сравнивать:

1 alert(undefined > 0); // false (1)
2 alert(undefined < 0); // false (2)
3 alert(undefined == 0); // false (3)

  • Сравнения (1) и (2) дают false потому, что undefined при преобразовании к числу дает NaN. А значение NaN по стандарту устроено так, что сравнения ==, <,>, <=, >= и даже === с ним возвращают false.
  • Проверка равенства (3) дает false, потому что в стандарте явно прописано, что undefined равно лишь null и ничему другому.

Вывод: любые сравнения с undefined/null, кроме точного ===, следует делать с осторожностью. Желательно не использовать сравнения >= > < <=, во избежание ошибок в коде.

так же возможно использовать автоматическую проверку на truthy и falsy значения

Иногда требуется проверить, есть ли в переменной какое-либо значение. При этом важно учитывать и null, и undefined, и другие falsy-значения (NaN, пустая строка, 0).

  if (test1 !== null || test1 !== undefined || test1 !== '') {
    // logic
}
    

К счастью, нет необходимости проводить все проверки по отдельности, тем более, что при этом легко что-нибудь упустить. Например, 0, который в ряде ситуаций тоже может расцениваться как "пустое" значение.

Можно просто положиться на JavaScript и его динамическую конверсию типов.

 if (test1) {
  // logic
}
    

Оператор if самостоятельно приведет переменную к логическому значению и осуществит проверку.

Выводы

  • В JavaScript есть логические значения true (истина) и false (ложь). Операторы сравнения возвращают их.
  • Строки сравниваются побуквенно.
  • Значения разных типов приводятся к числу при сравнении, за исключением строгого равенства=== (!==).
  • Значения null и undefined равны == друг другу и не равны ничему другому. В других сравнениях (с участием >,<) их лучше не использовать, так как они ведут себя не как 0.

К сожалению, в одной статье не просто дать все знания про операторы сравнения. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое операторы сравнения, логические значения, truthy, falsy и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Из статьи мы узнали кратко, но содержательно про операторы сравнения
создано: 2014-10-07
обновлено: 2024-11-25
291



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)