HTML Diff
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