renovations
This commit is contained in:
parent
dceccedb58
commit
6ac9e3a500
182 changed files with 275 additions and 324 deletions
|
@ -13,7 +13,7 @@
|
|||
result = a || b;
|
||||
```
|
||||
|
||||
**Логическое ИЛИ в классическом программировании работает следующим образом: "если *хотя бы один* из аргументов `true`, то возвращает `true`, иначе -- `false`".**
|
||||
Логическое ИЛИ в классическом программировании работает следующим образом: "если *хотя бы один* из аргументов `true`, то возвращает `true`, иначе -- `false`". В JavaScript, как мы увидим далее, это не совсем так, но для начала рассмотрим только логические значения.
|
||||
|
||||
Получается следующая "таблица результатов":
|
||||
|
||||
|
@ -25,7 +25,7 @@ alert( true || false); // true
|
|||
alert( false || false); // false
|
||||
```
|
||||
|
||||
Если значение не логического типа -- то оно к нему приводится. Например, число `1` будет воспринято как `true`, а `0` -- как `false`:
|
||||
Если значение не логического типа -- то оно к нему приводится в целях вычислений. Например, число `1` будет воспринято как `true`, а `0` -- как `false`:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -129,6 +129,9 @@ alert(result); // выведет "Привет!" - первое значение
|
|||
alert(undefined || '' || false || 0); // 0
|
||||
```
|
||||
|
||||
[summary]
|
||||
Итак, оператор `||` вычисляет операнды слева направо до первого "истинного" и возвращает его, а если все ложные -- то последнее значение.
|
||||
[/summary]
|
||||
|
||||
## && (И)
|
||||
|
||||
|
@ -171,7 +174,7 @@ if ( 1 && 0 ) { // вычислится как true && false
|
|||
|
||||
К И применим тот же принцип "короткого цикла вычислений", но немного по-другому, чем к ИЛИ.
|
||||
|
||||
**Если левый аргумент -- `false`, оператор И возвращает его и заканчивает вычисления. Иначе -- вычисляет и возвращает правый аргумент.**
|
||||
Если левый аргумент -- `false`, оператор И возвращает его и заканчивает вычисления. Иначе -- вычисляет и возвращает правый аргумент.
|
||||
|
||||
Например:
|
||||
|
||||
|
@ -197,7 +200,12 @@ alert(1 && 2 && null && 3); // null
|
|||
alert(1 && 2 && 3); // 3
|
||||
```
|
||||
|
||||
**Приоритет оператора И `&&` больше, чем ИЛИ `||`, т.е. он выполняется раньше.**
|
||||
[summary]
|
||||
Итак, оператор `&&` вычисляет операнды слева направо до первого "ложного" и возвращает его, а если все истинные -- то последнее значение.
|
||||
[/summary]
|
||||
|
||||
[smart header="Приоритет у `&&` больше, чем у `||`"]
|
||||
Приоритет оператора И `&&` больше, чем ИЛИ `||`, так что он выполняется раньше.
|
||||
|
||||
Поэтому в следующем коде сначала будет вычислено правое И: `1 && 0 = 0`, а уже потом -- ИЛИ.
|
||||
|
||||
|
@ -205,7 +213,7 @@ alert(1 && 2 && 3); // 3
|
|||
//+ run
|
||||
alert(5 || 1 && 0); // 5
|
||||
```
|
||||
|
||||
[/smart]
|
||||
|
||||
[warn header="Не используйте `&&` вместо `if`"]
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ alert( +apples + +oranges); // 5, число, оба операнда предв
|
|||
<tr><td>5</td><td>деление</td><td>`/`</td></tr>
|
||||
<tr><td>6</td><td>сложение</td><td>`+`</td></tr>
|
||||
<tr><td>6</td><td>вычитание</td><td>`-`</td></tr>
|
||||
<tr><td>17</td><td>присвоение</td><td>`=`</td></tr>
|
||||
<tr><td>3</td><td>присвоение</td><td>`=`</td></tr>
|
||||
<tr><td>...</td><td>...</td><td>...</td></tr>
|
||||
</table>
|
||||
|
||||
|
@ -145,7 +145,7 @@ alert( +apples + +oranges); // 5, число, оба операнда предв
|
|||
|
||||
Обратим внимание, в таблице приоритетов также есть оператор присваивания `=`.
|
||||
|
||||
У него -- один из самых низких приоритетов: `17`.
|
||||
У него -- один из самых низких приоритетов: `3`.
|
||||
|
||||
Именно поэтому, когда переменную чему-либо присваивают, например, `x = 2 * 2 + 1` сначала выполнится арифметика, а уже затем -- произойдёт присвоение `=`.
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ alert(number); // Infinity, плюс преобразовал строку "Infi
|
|||
|
||||
Обычно если мы хотим от посетителя получить число, то `Infinity` или `NaN` нам не подходят. Для того, чтобы отличить "обычные" числа от таких специальных значений, существует функция `isFinite`.
|
||||
|
||||
**Функция `isFinite(n)` возвращает `true` только тогда, когда `n` -- обычное число, а не одно из этих значений:**
|
||||
**Функция `isFinite(n)` преобразует аргумент к числу и возвращает `true`, если это не `NaN/Infinity/-Infinity`:**
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
|
|
@ -245,6 +245,14 @@ setTimeout(function() {}, 100);
|
|||
В Internet Explorer, нулевая задержка `setInterval(.., 0)` не сработает. Это касается именно `setInterval`, т.е. `setTimeout(.., 0)` работает нормально.
|
||||
[/warn]
|
||||
|
||||
[smart header="Откуда взялись эти 4мс?"]
|
||||
Почему минимальная задержка -- 4мс, а не 1мс? Зачем она вообще существует?
|
||||
|
||||
Это -- "привет" от прошлого. Браузер Chrome как-то пытался убрать минимальную задержку в своих ранних версиях, но оказалось, что существуют сайты, которые используют `setTimeout(..,0)` рекурсивно, создавая тем самым "асинхронный цикл". И, если задержку совсем убрать, то будет 100% загрузка процессора, такой сайт "подвесит" браузер.
|
||||
|
||||
Поэтому, чтобы не ломать существующие скрипты, решили сделать задержку. По возможности, небольшую. На время создания стандарта оптимальным числом показались 4мс.
|
||||
[/smart]
|
||||
|
||||
## Реальная частота срабатывания
|
||||
|
||||
В ряде ситуаций таймер будет срабатывать реже, чем обычно. Задержка между вызовами `setInterval(..., 4)` может быть не 4мс, а 30мс или даже 1000мс.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue