Skip to content

Commit

Permalink
renovations
Browse files Browse the repository at this point in the history
  • Loading branch information
iliakan committed Apr 1, 2015
1 parent 0e9ceb2 commit 150d92f
Show file tree
Hide file tree
Showing 47 changed files with 288 additions and 108 deletions.
2 changes: 1 addition & 1 deletion 1-js/2-first-steps/11-uibasic/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ alert('Вам ' + years + ' лет!')
```

[warn header="Всегда указывайте `default`"]
Вообще, второй `default` может отсутствовать. Однако при этом IE вставит в диалог значение по умолчанию `"undefined"`.
Второй параметр может отсутствовать. Однако при этом IE вставит в диалог значение по умолчанию `"undefined"`.

Запустите этот код <u>в IE</u>, чтобы понять о чем речь:

Expand Down
16 changes: 16 additions & 0 deletions 1-js/2-first-steps/13-logical-ops/5-alert-and-or/solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Ответ: `3`.

```js
//+ run
alert( null || 2 && 3 || 4 );
```

Приоритет оператора `&&` выше, чем `||`, поэтому он выполнится первым.

Последовательность вычислений:
```
null || 2 && 3 || 4
null || 3 || 4
3
```

10 changes: 10 additions & 0 deletions 1-js/2-first-steps/13-logical-ops/5-alert-and-or/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Что выведет этот код?

[importance 5]

Что выведет код ниже?

```js
alert( null || 2 && 3 || 4 );
```

22 changes: 14 additions & 8 deletions 1-js/2-first-steps/13-logical-ops/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ if (hour < 10 || hour > 18 || isWeekend) {

## Короткий цикл вычислений


JavaScript вычисляет несколько ИЛИ слева направо. При этом, чтобы экономить ресурсы, используется так называемый *"короткий цикл вычисления"*.

Допустим, вычисляются несколько ИЛИ подряд: `a || b || c || ...`. Если первый аргумент -- `true`, то результат заведомо будет `true` (хотя бы одно из значений -- `true`), и остальные значения игнорируются.
Expand Down Expand Up @@ -91,6 +92,11 @@ alert(x); // 1

## Значение ИЛИ

[quote author="Илья Канатов, участник курса JavaScript"]
`||` запинается на "правде",<br>
`&&` запинается на "лжи".
[/quote]

Итак, как мы видим, оператор ИЛИ вычисляет ровно столько значений, сколько необходимо -- до первого `true`.

При этом оператор ИЛИ возвращает то значение, на котором остановились вычисления. Причём, не преобразованное к логическому типу.
Expand Down Expand Up @@ -129,9 +135,9 @@ alert( result ); // выведет "Привет!" - первое значени
alert( undefined || '' || false || 0 ); // 0
```

[summary]
Итак, оператор `||` вычисляет операнды слева направо до первого "истинного" и возвращает его, а если все ложные -- то последнее значение.
[/summary]

Иначе можно сказать, что "`||` запинается на правде".

## && (И)

Expand Down Expand Up @@ -201,9 +207,9 @@ alert( 1 && 2 && null && 3 ); // null
alert( 1 && 2 && 3 ); // 3
```

[summary]
Итак, оператор `&&` вычисляет операнды слева направо до первого "ложного" и возвращает его, а если все истинные -- то последнее значение.
[/summary]

Иначе можно сказать, что "`&&` запинается на лжи".

[smart header="Приоритет у `&&` больше, чем у `||`"]
Приоритет оператора И `&&` больше, чем ИЛИ `||`, так что он выполняется раньше.
Expand Down Expand Up @@ -262,15 +268,15 @@ var result = !value;

```js
//+ run
alert(!true) // false
alert(!0) // true
alert( !true ); // false
alert( !0 ); // true
```

**В частности, двойное НЕ используются для преобразования значений к логическому типу:**

```js
//+ run
alert(!!"строка") // true
alert(!!null) // false
alert( !!"строка" ); // true
alert( !!null ); // false
```

Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ true + false = 1
0 || 5 = 5
null + 1 = 1 // (3)
undefined + 1 = NaN // (4)
null == "\n0\n" = false // (5)
+null == +"\n0\n" = true // (6)
```

<ol>
<li>Оператор `"+"` в данном случае прибавляет `1` как строку, и затем `0`.</li>
<li>Оператор `"-"` работает только с числами, так что он сразу приводит `""` к `0`.</li>
<li>`null` при численном преобразовании становится `0`</li>
<li>`undefined` при численном преобразовании становится `NaN`</li>
<li>При сравнении `==` с `null` преобразования не происходит, есть жёсткое правило: `null == undefined` и только.</li>
<li>И левая и правая часть `==` преобразуются к числу `0`.</li>
</ol>
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@ true + false
0 || 5
null + 1
undefined + 1
null == "\n0\n"
+null == +"\n0\n"
```

2 changes: 1 addition & 1 deletion 1-js/2-first-steps/4-strict-mode/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
Впрочем, проблема не так страшна. Несовместимостей мало. И, если их знать (а в учебнике мы будем останавливаться на них) и писать правильный код, то всё будет в порядке и `"use strict"` станет нашим верным помощником.
</dd>
<dt>Библиотеки, написанные без учёта `"use strict"`.</dt>
<dd>Некоторые библиотеки, который написаны без `"use strict"`, не всегда корректно работают, если вызывающий код содержит `"use strict"`.
<dd>Некоторые библиотеки, которые написаны без `"use strict"`, не всегда корректно работают, если вызывающий код содержит `"use strict"`.

В первую очередь имеются в виду сторонние библиотеки, которые писали не мы, и которые не хотелось бы переписывать или править.

Expand Down
17 changes: 9 additions & 8 deletions 1-js/2-first-steps/8-operators/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,23 +123,24 @@ alert( +apples + +oranges ); // 5, число, оба операнда пред

Из школы мы знаем, что умножение в выражении `2 * 2 + 1` выполнится раньше сложения, т.к. его *приоритет* выше, а скобки явно задают порядок выполнения. Но в JavaScript -- гораздо больше операторов, поэтому существует целая [таблица приоритетов](https://developer.mozilla.org/en/JavaScript/Reference/operators/operator_precedence).

Она содержит как уже пройденные операторы, так и те, которые мы еще не проходили. В ней каждому оператору задан числовой приоритет. Тот, у кого число меньше -- выполнится раньше. Если приоритет одинаковый, то порядок выполнения -- слева направо.
Она содержит как уже пройденные операторы, так и те, которые мы еще не проходили. В ней каждому оператору задан числовой приоритет. Тот, у кого число больше -- выполнится раньше. Если приоритет одинаковый, то порядок выполнения -- слева направо.

Отрывок из таблицы:

<table>
<tr><td>...</td><td>...</td><td>...</td></tr>
<tr><td>4</td><td>унарный плюс</td><td>`+`</td></tr>
<tr><td>4</td><td>унарный минус</td><td>`-`</td></tr>
<tr><td>5</td><td>умножение</td><td>`*`</td></tr>
<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>15</td><td>унарный плюс</td><td>`+`</td></tr>
<tr><td>15</td><td>унарный минус</td><td>`-`</td></tr>
<tr><td>14</td><td>умножение</td><td>`*`</td></tr>
<tr><td>14</td><td>деление</td><td>`/`</td></tr>
<tr><td>13</td><td>сложение</td><td>`+`</td></tr>
<tr><td>13</td><td>вычитание</td><td>`-`</td></tr>
<tr><td>...</td><td>...</td><td>...</td></tr>
<tr><td>3</td><td>присвоение</td><td>`=`</td></tr>
<tr><td>...</td><td>...</td><td>...</td></tr>
</table>

Так как "унарный плюс" имеет приоритет `4`, выше, чем `6` у обычного "сложения", то в выражении `+apples + +oranges` сначала сработали плюсы у `apples` и `oranges`, а затем уже обычное сложение.
Так как "унарный плюс" имеет приоритет `15`, выше, чем `13` у обычного "сложения", то в выражении `+apples + +oranges` сначала сработали плюсы у `apples` и `oranges`, а затем уже обычное сложение.

## Присваивание

Expand Down
6 changes: 6 additions & 0 deletions 1-js/4-data-structures/11-datetime/2-get-week-day/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,9 @@ var date = new Date(2014, 0, 3); // 3 января 2014
alert( getWeekDay(date) ); // 'пт'
```

В современных браузерах можно использовать и `toLocaleString`:
```js
//+ run
var date = new Date(2014, 0, 3); // 3 января 2014
alert( date.toLocaleString('ru', {weekday: 'short'}) ); // 'Пт'
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function extractCurrencyValue(str) {
return +str.slice(1);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
describe("extractCurrencyValue", function() {

it("выделяет из строки $120 число 120", function() {
assert.strictEqual(extractCurrencyValue('$120'), 120);
});


});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Возьмём часть строки после первого символа и приведём к числу: `+str.slice(1)`.
8 changes: 8 additions & 0 deletions 1-js/4-data-structures/3-string/4-extract-currency/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Выделить число

[importance 4]

Есть стоимость в виде строки: `"$120"`. То есть, первым идёт знак валюты, а затем -- число.

Создайте функцию `extractCurrencyValue(str)`, которая будет из такой строки выделять число-значение, в данном случае 120.

12 changes: 6 additions & 6 deletions 1-js/4-data-structures/9-array-iteration/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

Метод ["arr.forEach(callback[, thisArg])"](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) используется для перебора массива.

Он позволяет для каждого элемента массива вызывает функцию `callback`.
Он для каждого элемента массива вызывает функцию `callback`.

Этой функции он передаёт три параметра `callback(item, i, arr)`:

Expand Down Expand Up @@ -64,16 +64,16 @@ alert( positiveArr ); // 1,2,3

```js
//+ run
var pages = ['a.html', 'b.html', 'c.html'];
var names = ['HTML', 'CSS', 'JavaScript'];

*!*
var urls = pages.map(function(page) {
return 'http://site.com/' + page;
var nameLengths = names.map(function(name) {
return name.length;
});
*/!*

// к каждой строке был прибавлен префикс
alert( urls ); // http://site.com/a.html, http://site.com/b.html...
// получили массив с длинами
alert( nameLengths ); // 4,3,10
```

## every/some
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,22 @@
При создании объекта `{ value: this }`, в свойство `value` копируется ссылка на текущий контекст, то есть на `user`.

Получается что `user.export().value == user`.


```js
//+ run
var name = "";

var user = {
name: "Василий",

export: function() {
return {
value: this
};
}

};

alert( user.export().value == user ); // true
```
2 changes: 2 additions & 0 deletions 1-js/6-objects-more/1-object-methods/8-chain-calls/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,7 @@ ladder.showStep(); // 1
ladder.up().up().down().up().down().showStep(); // 1
```

Как видно, такая запись содержит "меньше букв" и может быть более наглядной.

Такой подход называется "чейнинг" (chaining) и используется, например, во фреймворке jQuery.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

Основной метод для управления свойствами -- [Object.defineProperty](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty).

Он позволяет как просто объявить свойство объекта, так и настроить тонко настроить его особые аспекты, которые никак иначе не изменить.
Он позволяет как просто объявить свойство объекта, так и тонко настроить его особые аспекты, которые никак иначе не изменить.

Синтаксис:

Expand Down
8 changes: 5 additions & 3 deletions 1-js/6-objects-more/7-bind/3-second-bind/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ f(); // Вася

Первый вызов `f.bind(..Вася..)` возвращает "обёртку", которая устанавливает контекст для `f` и передаёт вызов `f`.

Следующий вызов `bind` будет устанавливать контекст уже для этой обёртки, это ни на что не влияет.
Следующий вызов `bind` будет устанавливать контекст уже для этой обёртки. Это ни на что не повлияет.

Чтобы это проще понять, используем наш собственный вариант `bind` вместо встроенного:

Expand Down Expand Up @@ -45,12 +45,14 @@ f(); // Вася
function bind(func, context) {
*!*
return function() {
// здесь this не используется
return func.apply(context, arguments);
};
*/!*
}
```

В этой обёртке нигде не используется `this`, только `func` и `context`. Посмотрите на код, там нигде нет `this`.
В этой обёртке нигде не используется `this`, контекст `context` берётся из замыкания. Посмотрите на код, там нигде нет `this`.

Поэтому следующий `bind` в строке `(2)`, который выполняется уже над обёрткой и фиксирует в ней `this`, ни на что не влияет. Какая разница, что будет в качестве `this` в функции, которая этот `this` не использует? Контекст `context`, как видно в коде выше, она получает через замыкание из аргументов первого `bind`.

Поэтому следующий `bind` в строке `(2)`, который выполняется уже над обёрткой и фиксирует в ней `this`, ни на что не влияет. Какая разница, что будет в качестве `this` в функции, которая этот `this` не использует?
2 changes: 1 addition & 1 deletion 1-js/6-objects-more/7-bind/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

В браузере есть встроенная функция `setTimeout(func, ms)`, которая вызывает выполение функции `func` через `ms` миллисекунд (=1/1000 секунды).

Мы подробно остановимся на ней и её тонкостях позже, в главе [](/setTimeout-setInterval), а пока просто посмотрим пример.
Мы подробно остановимся на ней и её тонкостях позже, в главе [](/settimeout-setinterval), а пока просто посмотрим пример.

Этот код выведет "Привет" через 1000мс, то есть 1 секунду:

Expand Down
4 changes: 2 additions & 2 deletions 1-js/6-objects-more/8-decorators/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ alert( timers.myFunc ); // общее время выполнения всех

```js
//+ run
var timers = {}
var timers = {};

// прибавит время выполнения f к таймеру timers[timer]
function timingDecorator(f, timer) {
Expand Down Expand Up @@ -114,7 +114,7 @@ function sum(a, b) {
alert( sum(true, { name: "Вася", age: 35 }) ); // true[Object object]
```

Функция "как-то" отработала, но в реальной жизни такой вызов, скорее всего, будет следствием программной ошибки. Всё-таки `sum` предназначена для суммирования чисел, а не объектов.
Функция "как-то" отработала, но в реальной жизни передача в `sum` подобных значений, скорее всего, будет следствием программной ошибки. Всё-таки `sum` предназначена для суммирования чисел, а не объектов.

Многие языки программирования позволяют прямо в объявлении функции указать, какие типы данных имеют параметры. И это удобно, поскольку повышает надёжность кода.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@ function formatDate(date) {
// перевести секунды в миллисекунды и преобразовать к Date
date = new Date(date * 1000);
} else if (typeof date == 'string') {
// разобрать строку и преобразовать к Date
date = date.split('-');
date = new Date(date[0], date[1] - 1, date[2]);
// строка в стандартном формате автоматически будет разобрана в дату
date = new Date(date);
} else if (Array.isArray(date)) {
date = new Date(date[0], date[1], date[2]);
}
// преобразования для поддержки полиморфизма завершены,
// теперь мы работаем с датой (форматируем её)

return date.toLocaleString("ru", {day: '2-digit', month: '2-digit', year: '2-digit'});

/*
// можно и вручную, если лень добавлят в старый IE поддержку локализации
var day = date.getDate();
if (day < 10) day = '0' + day;
Expand All @@ -23,6 +26,7 @@ function formatDate(date) {
if (year < 10) year = '0' + year;
var formattedDate = day + '.' + month + '.' + year;

return formattedDate;
*/
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
Ее первый аргумент должен содержать дату в одном из видов:
<ol>
<li>Как объект `Date`.</li>
<li>Как строку в формате `yyyy-mm-dd`.</li>
<li>Как строку, например `yyyy-mm-dd` или другую в стандартном формате даты.</li>
<li>Как число *секунд* с `01.01.1970`.</li>
<li>Как массив `[гггг, мм, дд]`, месяц начинается с нуля</li>
</ol>
Expand Down
Loading

0 comments on commit 150d92f

Please sign in to comment.