This commit is contained in:
Ilya Kantor 2014-10-26 22:10:13 +03:00
parent 06f61d8ce8
commit f301cb744d
2271 changed files with 103162 additions and 0 deletions

View file

@ -0,0 +1,13 @@
Каждая строчка решения соответствует одному шагу задачи:
```js
//+ run
var admin, name; // две переменных через запятую
name = "Василий";
admin = name;
alert(admin); // "Василий"
```

View file

@ -0,0 +1,10 @@
# Работа с переменными
[importance 2]
<ol>
<li>Объявите две переменные: `admin` и `name`. </li>
<li>Запишите в `name` строку `"Василий"`. </li>
<li>Скопируйте значение из `name` в `admin`.</li>
<li>Выведите `admin` (должно вывести "Василий").</li>
</ol>

View file

@ -0,0 +1,252 @@
# Переменные
В зависимости от того, для чего вы делаете скрипт, понадобится работать с информацией.
Если это электронный магазин - то это товары, корзина. Если чат - посетители, сообщения и так далее.
Чтобы хранить информацию, используются *переменные*.
[cut]
## Переменная
***Переменная* состоит из имени и выделенной области памяти, которая ему соответствует**.
Для *объявления* или, другими словами, *создания переменной* используется ключевое слово `var`:
```js
var message;
```
После объявления, можно записать в переменную данные:
```js
var message;
message = 'Привет'; // сохраним в переменной строку
```
Эти данные будут сохранены в соответствующей области памяти и в дальнейшем доступны при обращении по имени:
```js
//+ run
var message;
message = 'Привет';
alert(message); // выведет содержимое переменной
```
Для краткости можно совместить объявление переменной и запись данных:
```js
var message = 'Привет';
```
Можно даже объявить несколько переменных сразу:
```js
var user = 'Вася', age = 25, message = 'Привет';
```
### Аналогия из жизни
**Проще всего понять переменную, если представить ее как "коробку" для данных, с уникальным именем.**
Например, переменная `message` - это коробка, в которой хранится значение `"Привет"`:
<img src="box-message-hello.png">
В коробку можно положить любое значение, а позже - поменять его. Значение в переменной можно изменять сколько угодно раз:
```js
//+ run
var message;
message = 'Привет';
message = 'Мир'; // заменили значение
alert(message);
```
<img src="box-trans1.png">
При изменении значения старое содержимое переменной удаляется.
[smart]
Существуют [функциональные](http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) языки программирования, в которых значение переменной менять нельзя. Например, [Scala](http://www.scala-lang.org/) или [Erlang](http://www.erlang.org/).
В таких языках положил один раз значение в коробку - и оно хранится там вечно, ни удалить ни изменить. А нужно что-то другое сохранить - изволь создать новую коробку (объявить новую переменную), повторное использование невозможно.
С виду -- не очень удобно, но, как ни странно, и на таких языках вполне можно успешно программировать. Более того, оказывается, что в ряде областей, например в распараллеливании вычислений, они имеют преимущества. Изучение какого-нибудь функционального языка рекомендуется для расширения кругозора.
[/smart]
### Имена переменных [#variable-naming]
На имя переменной в JavaScript наложены всего два ограничения.
<ol>
<li>Имя может состоять из: букв, цифр, символов `$` и `_`</li>
<li>Первый символ не должен быть цифрой.</li>
</ol>
Например:
```js
var myName;
var test123;
```
**Что особенно интересно -- доллар `'$'` и знак подчеркивания `'_'` являются такими же обычными символами, как буквы:**
```js
//+ run untrusted
var $ = 1; // объявили переменную с именем '$'
var _ = 2; // переменная с именем '_'
alert($ + _); // 3
```
А такие переменные были бы неправильными:
```js
var 1a; // начало не может быть цифрой
var my-name; // дефис '-' не является разрешенным символом
```
[smart header="Регистр букв имеет значение"]
Переменные `apple` и `AppLE` - две разные переменные.
[/smart]
[smart header="Русские буквы допустимы, но не рекомендуются"]
В названии переменных можно использовать и русские буквы, например:
```js
//+ run
var имя = "Вася";
alert(имя); // "Вася"
```
Технически, ошибки здесь нет, но на практике сложилась традиция использовать в именах только английские буквы.
[/smart]
[warn header="Зарезервированные имена"]
Существует список зарезервированных слов, которые нельзя использовать для переменных, так как они используются самим языком, например: `var, class, return, export` и др.
Некоторые такие слова, например, `export`, не используются в современном JavaScript, но они зарезервированы на будущее.
Например, такой пример выдаст синтаксическую ошибку:
```js
//+ run
var class = 5; // ошибка, слово зарезервировано
alert(class);
```
[/warn]
### Копирование значений
Переменные в JavaScript могут хранить не только строки, но и другие данные, например, числа.
Объявим две переменные, положим в одну -- строку, а в другую -- число:
```js
var num = 100500;
var message = 'Привет';
```
При этом в любой момент значение можно скопировать из одной переменной в другую:
```js
var num = 100500;
var message = 'Привет';
*!*
message = num;
*/!*
```
При копировании значение из `num` перезаписывает текущее в `message`.
**В "коробке" `message` изменится значение**:
<img src="box-trans2.png">
После этого присваивания в обеих коробках `num` и `message` находится одно и то же значение `100500`.
## Важность директивы var
В JavaScript вы можете создать переменную и без `var`, достаточно просто присвоить ей значение:
```js
x = "value"; // переменная создана, если ее не было
```
Технически, это не вызовет ошибки, но делать так все-таки не стоит.
**Всегда определяйте переменные через `var`**.
Это хороший тон в программировании и помогает избежать ошибок.
[warn header="Ошибка в IE8- без `var`"]
Если же вы собираетесь поддерживать IE8-, то у меня для вас ещё одна причина всегда использовать `var`.
Следущий документ в IE8- ничего не выведет, будет ошибка:
```html
<div id="test"></div>
<script>
*!*
test = 5; // здесь будет ошибка!
*/!*
alert(test); // не сработает
</script>
```
Это потому, что переменная `test` не объявлена через `var` и совпадает с `id` элемента `<div>`. Даже не спрашивайте почему -- это ошибка в браузере IE до версии 9.
Самое "забавное" -- то, что такая ошибка присвоения значений будет только в IE8- и только если на странице присутствует элемент с совпадающим с именем `id`.
Такие ошибки особенно "весело" исправлять и отлаживать.
Вывод простой -- всегда объявляем переменные через `var`, и сюрпризов не будет. Даже в старых IE.
[/warn]
## Константы
*Константа* -- это переменная, которая никогда не меняется. Как правило, их называют большими буквами, через подчёркивание. Например:
```js
//+ run
var COLOR_RED = "#F00";
var COLOR_GREEN = "#0F0";
var COLOR_BLUE = "#00F";
var COLOR_ORANGE = "#FF7F00";
var color = COLOR_ORANGE;
alert(color); // #FF7F00
```
Технически, константа является обычной переменной, то есть её *можно* изменить. Но мы *договариваемся* этого не делать.
Зачем нужны константы? Почему бы просто не писать `var color = "#FF7F00"`?
<ol>
<li>Во-первых, константа `COLOR_ORANGE` -- это понятное имя. По присвоению `var color="#FF7F00"` непонятно, что цвет -- оранжевый. Иными словами, константа `COLOR_ORANGE` является "понятным псевдонимом" для значения `#FF7F00`.</li>
<li>Во-вторых, опечатка в строке, особенно такой сложной как `#FF7F00`, может быть не замечена, а в имени константы её допустить куда сложнее.</li>
</ol>
**Константы используют вместо строк и цифр, чтобы сделать программу понятнее и избежать ошибок.**
## Итого
<ul>
<li>В JavaScript можно объявлять переменные для хранения данных. Это делается при помощи `var`.</li>
<li>Технически, можно просто записать значение и без объявления переменной, однако по ряду причин это не рекомендуется.</li>
<li>Вместе с объявлением можно сразу присвоить значение: `var x = 10`.</li>
<li>Переменные, которые названы ОЛЬШИМИ_БУКВАМИ`, являются константами, то есть никогда не меняются. Как правило, они используются для удобства, чтобы было меньше ошибок.</li>
</ul>

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB