Синтаксис JavaScript
JavaScript — язык и у него есть свой собственный синтаксис, который было бы неплохо отлично знать.
JavaScript программа состоит из предложений, которые разделяются точкой с запятой.
Иногда точку с запятой можно упустить и это сойдет с рук, но не всегда. Поэтому в том случае, когда подразумевается конец предложения, лучше не забыть ее ставить.
Если вы по невнимательности пропускаете точку с запятой, пробелы, ну или по другой причине ваш код не имеет стиль (а это важно!), то советую ESLint.
Предложения состоят из:
- Значений
- Операторов
- Выражений
- Ключевых слов
- Комментариев
В JavaScript существует два типа значений: переменные и литералы.
Переменные
Переменные используются для хранения значений. Для объявления переменных в JavaScript используется ключевое слово var.
Переменные мы можем объявить тремя вариантами:
- С помощью ключевого слова var. Например, var y = 56;
- Просто присвоив значение. Например, y = 56;
Но этот вариант нежелателен, так как в таком случае переменная становится глобальной.
Почему глобальная переменная – это плохо? Хотя бы потому, что становясь глобальной она выходит из-под контроля области действия функции. Она может быть как изменена другим кодом, так и сама переписать значение в чужом коде - С помощью ключевого слова let.
Т.к. в JavaScript (до ECMAScript 6) не существует область видимость в пределах блока, то ввели let, позволяющее объявить переменные с областью видимости – блок.
Например,if (true) {let y = 4;} console.log(y); // ReferenceError: y is not defined
Посмотреть текущую поддержку ES6 можно тут.
Литералы
Литералы — фиксированные значения. К ним относятся такие типы данных как null, Boolean, Number, Object, String.
Например, когда мы объявляем массив, то часть, которая идет после знака равно является литералом массива.
var food = [‘cheese’,’potates’,’cucumber’];
А food — это переменная.
Числа
Числа записываются как с десятичными знаками, так и без них.
10.50 1001
Для того, чтобы интерпретатор понял, что означает точка – вызов метода или плавающую точку, нам нужно ему подсказать, одним из способов:
1..toString() 1 .toString() // пробел перед точкой (1).toString() 1.0.toString()
Строка (String)
String — текст, написанный с помощью двойных или одинарных кавычек.
"I am string“ 'And I am string‘
По-хорошему, вам надо определить какие кавычки использовать и следовать своему выбору во время написания кода.
В настройках ESLint по-умолчанию даже предоставляют выбор, по результатам которого, код будет проверяться.
Идентификаторы
Название, которое мы дает переменным, функциями, свойствам называется идентификатором.
Он может содержать только буквенно-цифровые символы, «$» и «_».
Чем идентификатор отличается от String?
String – данные, а идентификатор часть кода.
var surname = “Smit”;
“Smit” однозначно данные — литерал строки, тогда как surname – хранилище для этого значения.
Обратите внимание, что дефис в идентификаторе не допускается, так как он используется для вычитания.
Выражения
Выражение — комбинация значений, переменных, операторов, которая вычисляет значение.
Например выражение, 3 * 5 вычисляет 15.
Выражение может содержать и переменную
x * 4
Конечно, значения могут быть и строкой.
Например выражение:
"The day" + " is " + "sunny" //вычисляется в строку "The day is sunny".
Выражения можно разделить на те, что присваивают значение переменной и на те которые просто вычисляют значения.
Первый случай:
x = 56
а второй:
7 + 5
Кстати, стоит нам добавить точку с запятой и у нас уже не выражение, а предложение!
var x = 56;
Запятая для выражений
Запятая вычисляет оба операнда и возвращает правое значение.
var x = 0; var y = (x++, 4); console.log(x); //1 console.log(y); //4
Выражения вычисляют значение и могут быть написаны везде, где значение ожидается. Например, аргумент в вызове функции или правая часть присваивания.
Каждая из следующих строк содержит выражение:
x x + 6 changeArray('a','b')
Везде где js ожидает предложение, вы можете также писать и выражения.
Подобное предложение называется инструкция-выражение.
Но вы не можете писать предложение, где js предполагает выражение. Например IF предложение не может стать аргументом функции.
Сравнение предложения и выражения
Взглянем на IF предложение и на условный оператор, который является выражением.
var result; if ( x > 0 ) { result = 'Положительное число'; } else { result = 'Отрицательное число'; }
Эквивалентно:
var result = ( x > 0 ? 'Положительное число' : 'Отрицательное число');
Между знаком = и ; выражение.
Для того, чтобы предотвратить двусмысленность при синтаксическом разборе, JS не позволяет использовать литералы объекта и выражения функций как предложения.
Из этого следует, что предложения-выражения не должны начинаться с:
- фигурных скобок
- с ключевого слова function
Если выражение начинается с того либо с другого, то следует его писать в контексте выражения.
Для этого выражение помещается скобки.
Функция-объявление и функция-выражение
Допустим, мы хотим объявить анонимную функцию-выражение, тогда пишем так:
(function(){return "ready!")());
Давайте рассмотрим, чем эта функция будет отличаться от функции-объявления вида
function getReady() { return "ready!" }
- Очевидно, что у анонимной нет имени. Но оно вполне может быть, тогда это будет именованная функция-выражение.
- Функция-объявление создается интерпретатором до выполнения кода, функция-выражение же только по время выполнения.
- Следовательно функции-выражения не доступны до их объявления.
А если мы запишем так ?
getReady(); var getReady = function(){ return "ready!"; } getReady();
В первой строчке получим ошибку: TypeError: getReady is not a function
Пятая же выведет нам «ready», так как функция была уже объявлена.
Это явление называется всплытием (hoisting), почему оно происходит описано в посте про выполнение JavaScript.