diff --git a/1-js/2-first-steps/13-logical-ops/article.md b/1-js/2-first-steps/13-logical-ops/article.md
index a132b6fb..4942472f 100644
--- a/1-js/2-first-steps/13-logical-ops/article.md
+++ b/1-js/2-first-steps/13-logical-ops/article.md
@@ -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`"]
diff --git a/1-js/2-first-steps/8-operators/article.md b/1-js/2-first-steps/8-operators/article.md
index e0f20193..3a8b7b69 100644
--- a/1-js/2-first-steps/8-operators/article.md
+++ b/1-js/2-first-steps/8-operators/article.md
@@ -135,7 +135,7 @@ alert( +apples + +oranges); // 5, число, оба операнда предв
5 | деление | `/` |
6 | сложение | `+` |
6 | вычитание | `-` |
-17 | присвоение | `=` |
+3 | присвоение | `=` |
... | ... | ... |
@@ -145,7 +145,7 @@ alert( +apples + +oranges); // 5, число, оба операнда предв
Обратим внимание, в таблице приоритетов также есть оператор присваивания `=`.
-У него -- один из самых низких приоритетов: `17`.
+У него -- один из самых низких приоритетов: `3`.
Именно поэтому, когда переменную чему-либо присваивают, например, `x = 2 * 2 + 1` сначала выполнится арифметика, а уже затем -- произойдёт присвоение `=`.
diff --git a/1-js/4-data-structures/2-number/article.md b/1-js/4-data-structures/2-number/article.md
index 397940ba..b467f990 100644
--- a/1-js/4-data-structures/2-number/article.md
+++ b/1-js/4-data-structures/2-number/article.md
@@ -161,7 +161,7 @@ alert(number); // Infinity, плюс преобразовал строку "Infi
Обычно если мы хотим от посетителя получить число, то `Infinity` или `NaN` нам не подходят. Для того, чтобы отличить "обычные" числа от таких специальных значений, существует функция `isFinite`.
-**Функция `isFinite(n)` возвращает `true` только тогда, когда `n` -- обычное число, а не одно из этих значений:**
+**Функция `isFinite(n)` преобразует аргумент к числу и возвращает `true`, если это не `NaN/Infinity/-Infinity`:**
```js
//+ run
diff --git a/1-js/7-js-misc/3-setTimeout-setInterval/article.md b/1-js/7-js-misc/3-setTimeout-setInterval/article.md
index 5ac95ffe..e649ed48 100644
--- a/1-js/7-js-misc/3-setTimeout-setInterval/article.md
+++ b/1-js/7-js-misc/3-setTimeout-setInterval/article.md
@@ -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мс.
diff --git a/8-extra/10-cookie/article.md b/12-extra/10-cookie/article.md
similarity index 100%
rename from 8-extra/10-cookie/article.md
rename to 12-extra/10-cookie/article.md
diff --git a/8-extra/10-cookie/safari-nocookie.png b/12-extra/10-cookie/safari-nocookie.png
similarity index 100%
rename from 8-extra/10-cookie/safari-nocookie.png
rename to 12-extra/10-cookie/safari-nocookie.png
diff --git a/8-extra/10-cookie/safari-nocookie@2x.png b/12-extra/10-cookie/safari-nocookie@2x.png
similarity index 100%
rename from 8-extra/10-cookie/safari-nocookie@2x.png
rename to 12-extra/10-cookie/safari-nocookie@2x.png
diff --git a/8-extra/11-intl/1-collate-array-sort/solution.md b/12-extra/11-intl/1-collate-array-sort/solution.md
similarity index 100%
rename from 8-extra/11-intl/1-collate-array-sort/solution.md
rename to 12-extra/11-intl/1-collate-array-sort/solution.md
diff --git a/8-extra/11-intl/1-collate-array-sort/task.md b/12-extra/11-intl/1-collate-array-sort/task.md
similarity index 100%
rename from 8-extra/11-intl/1-collate-array-sort/task.md
rename to 12-extra/11-intl/1-collate-array-sort/task.md
diff --git a/8-extra/11-intl/article.md b/12-extra/11-intl/article.md
similarity index 98%
rename from 8-extra/11-intl/article.md
rename to 12-extra/11-intl/article.md
index 3b4cb175..44a9e90e 100644
--- a/8-extra/11-intl/article.md
+++ b/12-extra/11-intl/article.md
@@ -1,6 +1,6 @@
-# Интернационализация, встроенные объекты Intl
+# Intl: интернационализация в JavaScript
-Общая проблема строк, дат, чисел в JavaScript -- они совершенно не в курсе языков и стран, где находится посетитель.
+Общая проблема строк, дат, чисел в JavaScript -- они "не в курсе" языка и особенностей стран, где находится посетитель.
В частности:
@@ -12,7 +12,7 @@
- В одних странах выводятся цифрами, в других -- иероглифами, длинные числа разделяются где-то пробелом, где-то запятой.
-Все современные браузеры, кроме IE10- (но есть библиотеки и для него) поддерживает стандарт [ECMA 402](http://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), предназначенный решить эти проблемы навсегда.
+Все современные браузеры, кроме IE10- (но есть библиотеки и для него) поддерживают стандарт [ECMA 402](http://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), предназначенный решить эти проблемы навсегда.
[cut]
diff --git a/8-extra/12-regexp-specials/article.md b/12-extra/12-regexp-specials/article.md
similarity index 100%
rename from 8-extra/12-regexp-specials/article.md
rename to 12-extra/12-regexp-specials/article.md
diff --git a/8-extra/3-templates/article.md b/12-extra/3-templates/article.md
similarity index 100%
rename from 8-extra/3-templates/article.md
rename to 12-extra/3-templates/article.md
diff --git a/8-extra/4-books/article.md b/12-extra/4-books/article.md
similarity index 71%
rename from 8-extra/4-books/article.md
rename to 12-extra/4-books/article.md
index 00e3c1fb..f687e3f1 100644
--- a/8-extra/4-books/article.md
+++ b/12-extra/4-books/article.md
@@ -1,15 +1,8 @@
# Книги по JS, HTML/CSS и не только
-При разработке сложных приложений вам понадобятся как смежные технологии, так и знание общей методологии программирования.
-[cut]
-
-Прямо сейчас вам будет достаточно знания основ HTML/CSS, но в будущем или параллельно с изучением учебника вы, возможно, захотите углубить свои знания и в других областях.
-
-**Для обучения JavaScript по учебнику чтение книг, которые здесь предложены, не является обязательным.**
-
Мне часто задают вопрос: "Какую литературу порекомендуете?". На этой странице я предлагаю рекомендации по различным темам. Всего несколько книг на каждую тему, из большего количества все равно пришлось бы выбирать.
-Кстати, по всем книжкам, особенно тех, которые касаются технологий, всегда ищите последнее издание.
+Кстати, по всем книжкам, особенно тем, которые касаются технологий, всегда ищите последнее издание.
P.S. Скачать книги здесь нельзя. Эта страница содержит только рекомендации.
@@ -18,20 +11,20 @@ P.S. Скачать книги здесь нельзя. Эта страница
CSS стоит изучать по одной из этих книг. Можно сразу по обеим.
-Для того, чтобы разобраться в конкретных вопросах CSS, и в качестве справочника полезна книга Эрика Мейера CSS. Каскадные таблицы стилей. Подробное руководство., а также [стандарт CSS 2.1](http://specs.operafan.net/css2.1RU/CSS21/visuren.html).
+Конечно, [стандарт CSS 2.1](http://specs.operafan.net/css2.1RU/CSS21/visuren.html) тоже будет вам в помощь. Подчас его скупая простота и точность гораздо понятнее, чем много страниц разъяснений.
## JavaScript
Полезное чтение о языке, встроенных методах и конструкциях JavaScript:
-- JavaScript. Подробное руководство.
+
- JavaScript. Подробное руководство.
Дэвид Флэнаган.
- JavaScript. Шаблоны.
Стоян Стефанов.
@@ -55,7 +48,7 @@ CSS стоит изучать по одной из этих книг. Можно
diff --git a/8-extra/5-setImmediate/article.md b/12-extra/5-setImmediate/article.md
similarity index 71%
rename from 8-extra/5-setImmediate/article.md
rename to 12-extra/5-setImmediate/article.md
index 45e2039a..178ddfdc 100644
--- a/8-extra/5-setImmediate/article.md
+++ b/12-extra/5-setImmediate/article.md
@@ -7,24 +7,50 @@
[cut]
## Метод setImmediate(func)
-Для того, чтобы поставить функцию в очередь на выполнение без задержки, в Microsoft предложили метод [setImmediate(func)](http://msdn.microsoft.com/en-us/library/ie/hh773176.aspx). Он реализован в IE10.
+Для того, чтобы поставить функцию в очередь на выполнение без задержки, в Microsoft предложили метод [setImmediate(func)](http://msdn.microsoft.com/en-us/library/ie/hh773176.aspx). Он реализован в IE10+ и на платформе Node.JS.
У `setImmediate` единственный аргумент -- это функция, выполнение которой нужно запланировать.
В других браузерах `setImmediate` нет, но его можно эмулировать, используя, к примеру, метод [postMessage](https://developer.mozilla.org/en-US/docs/DOM/window.postMessage), предназначенный для пересылки сообщений от одного окна другому. Детали работы с `postMessage` вы найдёте в статье [](/cross-window-messaging-with-postmessage). Желательно читать её после освоения темы "События".
-Эмуляция `setImmediate` с его помощью для всех браузеров, кроме IE7- (в которых нет `postMessage`, так что будет использован setTimeout):
+Полифилл для `setImmediate` через `postMessage`:
```js
-//+ hide="Раскрыть код" src="setImmediate.js"
+if (!window.setImmediate) window.setImmediate = (function() {
+ var head = { }, tail = head; // очередь вызовов, 1-связный список
+
+ var ID = Math.random(); // уникальный идентификатор
+
+ function onmessage(e) {
+ if(e.data != ID) return; // не наше сообщение
+ head = head.next;
+ var func = head.func;
+ delete head.func;
+ func();
+ }
+
+ if(window.addEventListener) { // IE9+, другие браузеры
+ window.addEventListener('message', onmessage);
+ } else { // IE8
+ window.attachEvent( 'onmessage', onmessage );
+ }
+
+ return window.postMessage ? function(func) {
+ tail = tail.next = { func: func };
+ window.postMessage(ID, "*");
+ } :
+ function(func) { // IE7-
+ setTimeout(func, 0);
+ };
+}());
```
Есть и более сложные эмуляции, включая [MessageChannel](http://www.w3.org/TR/webmessaging/#channel-messaging) для работы с [Web Workers](http://www.w3.org/TR/workers/) и хитрый метод для поддержки IE6-8: [](https://github.com/NobleJS/setImmediate). Все они по существу являются "хаками", направленными на то, чтобы обеспечить поддержку `setImmediate` в тех браузерах, где его нет.
## Тест производительности
-Чтобы сравнить реальную частоту срабатывания -- измерим время на подсчет от 1 до 100 при `setTimeout/setImmediate`:
+Чтобы сравнить реальную частоту срабатывания -- измерим время на 100 последовательных вызовов при `setTimeout(..0)` по сравнению с `setImmediate`:
-[iframe src="setImmediate" border="1" link edit]
+[codetabs src="setImmediate"]
Запустите пример выше -- и вы увидите реальную разницу во времени между `setTimeout(.., 0)` и `setImmediate`. Да, она может быть более в 50, 100 и более раз.
\ No newline at end of file
diff --git a/8-extra/5-setImmediate/setImmediate.view/index.html b/12-extra/5-setImmediate/setImmediate.view/index.html
similarity index 100%
rename from 8-extra/5-setImmediate/setImmediate.view/index.html
rename to 12-extra/5-setImmediate/setImmediate.view/index.html
diff --git a/8-extra/5-setImmediate/setImmediate.js b/12-extra/5-setImmediate/setImmediate.view/setImmediate.js
similarity index 100%
rename from 8-extra/5-setImmediate/setImmediate.js
rename to 12-extra/5-setImmediate/setImmediate.view/setImmediate.js
diff --git a/8-extra/6-bind-late/article.md b/12-extra/6-bind-late/article.md
similarity index 100%
rename from 8-extra/6-bind-late/article.md
rename to 12-extra/6-bind-late/article.md
diff --git a/8-extra/7-sublime/article.md b/12-extra/7-sublime/article.md
similarity index 76%
rename from 8-extra/7-sublime/article.md
rename to 12-extra/7-sublime/article.md
index 9c1b81b1..46891fef 100644
--- a/8-extra/7-sublime/article.md
+++ b/12-extra/7-sublime/article.md
@@ -9,9 +9,9 @@
## Горячие клавиши
Для наибольшего удобства "шпаргалка" должна быть распечатана и повешена перед глазами, поэтому она сделана в виде 3-колоночного PDF.
-Скачать шпаргалку в формате PDF
+[Скачать шпаргалку в формате PDF](sheet.pdf)
-Шпаргалка пока под Mac. Для Windows сочетания похожи, обычно вместо Mac-клавиши Cmd
под Windows будет Ctrl
. А если в сочетании есть и Cmd
и Ctrl
, то под Windows будет Ctrl
+ Shift
.
+Эта шпаргалка -- под Mac, для Windows сочетания похожи, обычно вместо Mac-клавиши Cmd
под Windows будет Ctrl
. А если в сочетании есть и Cmd
и Ctrl
, то под Windows будет Ctrl
+ Shift
.
**Вы часто используете сочетание, но его нет в списке? Поделитесь им в комментариях!**
diff --git a/12-extra/7-sublime/sheet.pdf b/12-extra/7-sublime/sheet.pdf
new file mode 100644
index 00000000..42f4db54
Binary files /dev/null and b/12-extra/7-sublime/sheet.pdf differ
diff --git a/8-extra/8-range-textrange-selection/56.gif b/12-extra/8-range-textrange-selection/56.gif
similarity index 100%
rename from 8-extra/8-range-textrange-selection/56.gif
rename to 12-extra/8-range-textrange-selection/56.gif
diff --git a/8-extra/8-range-textrange-selection/57.gif b/12-extra/8-range-textrange-selection/57.gif
similarity index 100%
rename from 8-extra/8-range-textrange-selection/57.gif
rename to 12-extra/8-range-textrange-selection/57.gif
diff --git a/8-extra/8-range-textrange-selection/58.gif b/12-extra/8-range-textrange-selection/58.gif
similarity index 100%
rename from 8-extra/8-range-textrange-selection/58.gif
rename to 12-extra/8-range-textrange-selection/58.gif
diff --git a/8-extra/8-range-textrange-selection/article.md b/12-extra/8-range-textrange-selection/article.md
similarity index 98%
rename from 8-extra/8-range-textrange-selection/article.md
rename to 12-extra/8-range-textrange-selection/article.md
index f0a9f898..add2aa45 100644
--- a/8-extra/8-range-textrange-selection/article.md
+++ b/12-extra/8-range-textrange-selection/article.md
@@ -1,6 +1,8 @@
# Выделение: Range, TextRange и Selection
В этой статье речь пойдет о документированных, но нечасто используемых объектах `Range`, `TextRange` и `Selection`. Мы рассмотрим вольный перевод спецификаций с понятными примерами и различные кроссбраузерные реализации.
+
+Эта статья представляет собой обновлённый вариант статьи Александра Бурцева, которой уже нет онлайн. Публикуется с его разрешения, спасибо, Александр!
[cut]
## Range
@@ -158,7 +160,7 @@ function domRangeHighlight(text) {
В действии:
-[iframe border="1" src="domRangeHighlight" edit link]
+[codetabs src="domRangeHighlight"]
С остальными свойствами и методами поэкспериментируйте сами. Перейдем к реализации range в IE.
@@ -266,7 +268,7 @@ function ieTextRangeHighlight(text) {
В действии:
-[iframe border="1" src="ieTextRangeHighlight" edit link]
+[codetabs border="1" src="ieTextRangeHighlight"]
С остальными свойствами и методами поэкспериментируйте сами.
@@ -358,8 +360,8 @@ function setSelection() {
```
-В действии:
-[iframe border="1" src="setSelection" edit link]
+В действии:
+[codetabs border="1" src="setSelection"]
## Снятие выделения
@@ -403,11 +405,10 @@ function clearSelection() {
```
В действии:
-[iframe border="1" src="fix-ie" edit link]
+[codetabs border="1" src="fix-ie"]
Код функций `getRangeObject(win)` для получения выделения в окне и `fixIERangeObject(range, win)` для исправления `TextRange` -- [edit src="fix-ie"]в песочнице вместе с этим примером[/edit].
-Эта статья представляет собой обновлённый вариант статьи Александра Бурцева, сайта которого сейчас нет онлайн. Спасибо, Александр!
[head]