0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Посмотрите на код ниже и попробуйте угадать, что будет напечатано на экран:</p>
1
<p>Посмотрите на код ниже и попробуйте угадать, что будет напечатано на экран:</p>
2
<p>Правильный ответ: 1</p>
2
<p>Правильный ответ: 1</p>
3
<p>Оператор<strong>ИЛИ</strong>работает так, что его выполнение (слева направо) прерывается и возвращается результат первого аргумента, который можно преобразовать в true. Если первый аргумент невозможно преобразовать в true, то возвращается второй, даже если его нельзя преобразовать в true.</p>
3
<p>Оператор<strong>ИЛИ</strong>работает так, что его выполнение (слева направо) прерывается и возвращается результат первого аргумента, который можно преобразовать в true. Если первый аргумент невозможно преобразовать в true, то возвращается второй, даже если его нельзя преобразовать в true.</p>
4
<p>Ниже пример с оператором<strong>И</strong>:</p>
4
<p>Ниже пример с оператором<strong>И</strong>:</p>
5
<p>Оператор<strong>И</strong>работает так, что его выполнение (слева направо) прерывается и возвращается результат первого аргумента, который можно преобразовать в false.</p>
5
<p>Оператор<strong>И</strong>работает так, что его выполнение (слева направо) прерывается и возвращается результат первого аргумента, который можно преобразовать в false.</p>
6
<p>В JavaScript есть два простых правила, по которым происходят преобразования:</p>
6
<p>В JavaScript есть два простых правила, по которым происходят преобразования:</p>
7
<ul><li>0, '' (пустая строка), undefined, NaN, null приводятся к false. Эти значения называют<em>falsy</em>.</li>
7
<ul><li>0, '' (пустая строка), undefined, NaN, null приводятся к false. Эти значения называют<em>falsy</em>.</li>
8
<li>Все остальное приводится к true</li>
8
<li>Все остальное приводится к true</li>
9
</ul><p>Этим активно пользуются в разработке, например, для определения значения по умолчанию:</p>
9
</ul><p>Этим активно пользуются в разработке, например, для определения значения по умолчанию:</p>
10
<p>Если name примет одно из falsy-значений, константе value будет присвоена пустая строка. В этом случае в последующем коде мы сможем работать с value как со строкой.</p>
10
<p>Если name примет одно из falsy-значений, константе value будет присвоена пустая строка. В этом случае в последующем коде мы сможем работать с value как со строкой.</p>
11
<p>Но здесь есть потенциальный баг. Если name содержит falsy-значение, а присваивание константе value значений типа 0, undefined, NaN или null допустимо, то код выше начнет работать неверно:</p>
11
<p>Но здесь есть потенциальный баг. Если name содержит falsy-значение, а присваивание константе value значений типа 0, undefined, NaN или null допустимо, то код выше начнет работать неверно:</p>
12
<p>В одном из уроков мы рассмотрели операторы сравнения === и !== и упомянули, что в JavaScript так же есть операторы == и !=, но их не стоит использовать. Отличия как раз заключаются в преобразовании типов:</p>
12
<p>В одном из уроков мы рассмотрели операторы сравнения === и !== и упомянули, что в JavaScript так же есть операторы == и !=, но их не стоит использовать. Отличия как раз заключаются в преобразовании типов:</p>
13
<p>Пустая строка и false - это разные значения, поэтому оператор === говорит "ложь! они не равны!". Но оператор == преобразует типы, и с его точки зрения пустая строка и false равны. Это преобразование неявное, поэтому по возможности избегайте операторов == и !=.</p>
13
<p>Пустая строка и false - это разные значения, поэтому оператор === говорит "ложь! они не равны!". Но оператор == преобразует типы, и с его точки зрения пустая строка и false равны. Это преобразование неявное, поэтому по возможности избегайте операторов == и !=.</p>
14
<p>Вспомните операцию отрицания:</p>
14
<p>Вспомните операцию отрицания:</p>
15
<p>При двойном отрицании !! итоговое значение равно начальному:</p>
15
<p>При двойном отрицании !! итоговое значение равно начальному:</p>
16
<p>Но здесь дополнительно может происходить преобразование типа. Поэтому результатом двойного отрицания всегда будет значение типа<em>boolean</em>. Этим приемом иногда пользуются, чтобы поменять тип данных.</p>
16
<p>Но здесь дополнительно может происходить преобразование типа. Поэтому результатом двойного отрицания всегда будет значение типа<em>boolean</em>. Этим приемом иногда пользуются, чтобы поменять тип данных.</p>
17
<h2>Ошибка выбора</h2>
17
<h2>Ошибка выбора</h2>
18
<p>Представьте себе задачу, в которой нам нужно проверить, что значение равно либо одному, либо другому. Например, переменная value должна содержать одно из двух значений: first или second. Начинающие разработчики иногда записывают это выражение так:</p>
18
<p>Представьте себе задачу, в которой нам нужно проверить, что значение равно либо одному, либо другому. Например, переменная value должна содержать одно из двух значений: first или second. Начинающие разработчики иногда записывают это выражение так:</p>
19
<p>В голове мы это себе примерно так и представляем, но языки работают по-другому, поэтому такой код приведет к неверному результату. Как его правильно прочитать? Мы должны вспомнить приоритет выполнения операций. Первым делом вычисляется все что указано в скобках, то есть 'first' || 'second'. Если выполнить этот код в репле, то вывод будет таким:</p>
19
<p>В голове мы это себе примерно так и представляем, но языки работают по-другому, поэтому такой код приведет к неверному результату. Как его правильно прочитать? Мы должны вспомнить приоритет выполнения операций. Первым делом вычисляется все что указано в скобках, то есть 'first' || 'second'. Если выполнить этот код в репле, то вывод будет таким:</p>
20
<p>Теперь мы можем заменить исходное выражение на частично вычисленное:</p>
20
<p>Теперь мы можем заменить исходное выражение на частично вычисленное:</p>
21
<p>Совсем не то, что мы ожидали. А теперь вернемся к началу, и напишем проверку правильно:</p>
21
<p>Совсем не то, что мы ожидали. А теперь вернемся к началу, и напишем проверку правильно:</p>
22
22