You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Больше/меньше или равно: <code>a >= b</code>, <code>a <= b</code>.
7
-
- Равно: `a == b`. Обратите внимание, для сравнения используется двойной знак равенства `=`. Один знак равенства `a = b` означал бы присваивание.
8
-
- Не равно. В математике обозначается символом <code>≠</code>. В JavaScript записывается как знак равенства с предшествующим ему восклицательным знаком: <code>a != b</code>.
9
+
- Равно: `a == b`. Обратите внимание, для сравнения используется двойной знак равенства `==`. Один знак равенства `a = b` означал бы присваивание.
10
+
- Не равно. В математике обозначается символом <code>≠</code>, но в JavaScript записывается как <code>a != b</code>.
11
+
12
+
В этом разделе мы больше узнаем про то, какие бывают сравнения, как язык с ними работает и к каким неожиданностям мы должны быть готовы.
13
+
14
+
В конце вы найдёте хороший рецепт того, как избегать "причуд" сравнения в JavaScript.
9
15
10
16
## Результат сравнения имеет логический тип
11
17
12
-
Операторы сравнения, как и другие операторы, возвращают значение. Это значение имеет логический тип.
18
+
Все операторы сравнения возвращают значение логического типа:
13
19
14
20
-`true` -- означает "да", "верно", "истина".
15
21
-`false` -- означает "нет", "неверно", "ложь".
@@ -39,23 +45,23 @@ alert( result ); // true
39
45
40
46
```js run
41
47
alert( 'Я'>'А' ); // true
42
-
alert( 'Кот'>'Код' ); // true
48
+
alert( 'Коты'>'Кода' ); // true
43
49
alert( 'Сонный'>'Сон' ); // true
44
50
```
45
51
46
52
Алгоритм сравнения двух строк довольно прост:
47
53
48
54
1. Сначала сравниваются первые символы строк.
49
-
2. Если первый символ первой строки больше (меньше), чем первый символ второй, то первая строка больше (меньше) второй.
55
+
2. Если первый символ первой строки больше (меньше), чем первый символ второй, то первая строка больше (меньше) второй. Сравнение завершено.
50
56
3. Если первые символы равны, то таким же образом сравниваются уже вторые символы строк.
51
57
4. Сравнение продолжается, пока не закончится одна из строк.
52
58
5. Если обе строки заканчиваются одновременно, то они равны. Иначе, большей считается более длинная строка.
53
59
54
-
В примерах выше сравнение `'Я' > 'А'` завершится на первом шаге, тогда как строки `"Кот"` и `"Код"` будут сравниваться посимвольно:
60
+
В примерах выше сравнение `'Я' > 'А'` завершится на первом шаге, тогда как строки `'Коты'` и `'Кода'` будут сравниваться посимвольно:
55
61
56
62
1.`К` равна `К`.
57
63
2.`о` равна `о`.
58
-
3.`т` больше чем `д`. На этом сравнение заканчивается. Первая строка больше.
64
+
3.`т` больше, чем `д`. На этом сравнение заканчивается. Первая строка больше.
59
65
60
66
```smart header="Используется кодировка Unicode, а не настоящий алфавит"
61
67
Приведённый выше алгоритм сравнения похож на алгоритм, используемый в словарях и телефонных книгах, но между ними есть и различия.
@@ -134,11 +140,11 @@ alert( 0 === false ); // false, так как сравниваются разн
134
140
135
141
Ещё есть оператор строгого неравенства `!==`, аналогичный `!=`.
136
142
137
-
Оператор строгого равенства дольше писать, но он делает код более очевидным и оставляет меньше мест для ошибок.
143
+
Оператор строгого равенства дольше писать, но он делает код более очевидным и оставляет меньше места для ошибок.
138
144
139
145
## Сравнение с null и undefined
140
146
141
-
Поведение `null` и `undefined` при сравнении с другими значениями - особое:
147
+
Поведение `null` и `undefined` при сравнении с другими значениями — особое:
142
148
143
149
При строгом равенстве `===`
144
150
: Эти значения различны, так как различны их типы.
С другой стороны, для нестрогого равенства `==` значений `undefined` и `null` действует особое правило: эти значения ни к чему не приводятся, они равны друг другу и не равны ничему другому. Поэтому (2) `null == 0` ложно.
177
183
178
-
### Несравнимое значение undefined
184
+
### Несравненное значение undefined
179
185
180
186
Значение `undefined` несравнимо с другими значениями:
- Сравнения `(1)` и `(2)` возвращают `false`, потому что `undefined` преобразуется в `NaN`, а `NaN` – это специальное числовое значение, которое возвращает `false` при любых сравнениях.
193
-
- Нестрогое равенство `(3)` возвращает `false`, потому что `undefined` равно только `null` и ничему больше.
199
+
- Нестрогое равенство `(3)` возвращает `false`, потому что `undefined` равно только `null`, `undefined` и ничему больше.
194
200
195
201
### Как избежать проблем
196
202
197
-
Зачем мы рассмотрели все эти примеры? Должны ли мы постоянно помнить обо всех этих особенностях? Не обязательно. Со временем все они станут вам знакомы, но можно избежать проблем, если следовать простому правилу.
198
-
199
-
Просто относитесь к любому сравнению с `undefined/null`, кроме строгого равенства `===`, с осторожностью.
203
+
Зачем мы рассмотрели все эти примеры? Должны ли мы постоянно помнить обо всех этих особенностях? Не обязательно. Со временем все они станут вам знакомы, но можно избежать проблем, если следовать надёжным правилам:
200
204
201
-
Не используйте сравнения `>= > < <=` с переменными, которые могут принимать значения `null/undefined`, если вы не уверены в том, что делаете. Если переменная может принимать эти значения, то добавьте для них отдельные проверки.
205
+
- Относитесь очень осторожно к любому сравнению с `undefined/null`, кроме случаев строгого равенства `===`.
206
+
- Не используйте сравнения `>= > < <=` с переменными, которые могут принимать значения `null/undefined`, разве что вы полностью уверены в том, что делаете. Если переменная может принимать эти значения, то добавьте для них отдельные проверки.
202
207
203
208
## Итого
204
209
205
210
- Операторы сравнения возвращают значения логического типа.
206
211
- Строки сравниваются посимвольно в лексикографическом порядке.
207
212
- Значения разных типов при сравнении приводятся к числу. Исключением является сравнение с помощью операторов строгого равенства/неравенства.
208
213
- Значения `null` и `undefined` равны `==` друг другу и не равны любому другому значению.
209
-
- Будьте осторожны при использовании операторов сравнений `>` и `<` с переменными, которые могут принимать значения `null/undefined`. Хорошей идеей будет сделать отдельную проверку на `null/undefined`.
214
+
- Будьте осторожны при использовании операторов сравнений вроде `>` и `<` с переменными, которые могут принимать значения `null/undefined`. Хорошей идеей будет сделать отдельную проверку на `null/undefined`.
0 commit comments