Переменные +
var
Cтарый способ объявления переменных, сейчас практически не используется, но можно встретить в старых проектах
// можно объявлять бех присваивания значения
var someValue;
console.log(someValue); // undefined (пустая коробка)
// = - оператор присвоения
// можно сколь угодно раз перезаписывть
someValue = 3;
someValue = 4;
someValue = 5;
console.log(someValue); // 5
// можно переобъявлять c тем же названием
var someValue = true;
console.log(someValue); // true
// можно объвлять сразу несколько переменных через запятую с присвоением значений или бех
var someValue1, someValue2, someValue3;
var someValue1 = 1, // в случае с присвоением var, ключевое слово var можно опустить, при объявлении локальных переменных должны всегда указывать
someValue2 = 2,
someValue3 = 3;
// запись в глобальный js-объект window (window.someValue)
// var hosting
var scope
Область видимости - функция, если переменная объявлена внутри функции Область видимости - глобальная, если переменная объявлена "наверху". Запись прямо в window
- Если
var
объявлена на самом верху (вне функций), то доступ к ней есть отовсюду - Если
var
объявлена внутри функции, то доступ к ней будет на любом уровне ниже объявления, "сверху" - будет ошибка! - Если
var
объявлена даже например внутриif
, то доступ к этой переменной будет глобальный, даже "сверху" (всплытие объявления переменныхvar hostiing
)
// внутри {}
if (true) {
// глобальное объявление внутри {} - есть только у var
var VAR = 123;
console.log(VAR); // 123 - доступ есть
if (true) {
console.log(VAR); // 123 - доступ есть
}
}
// обращение "сверху"
console.log(VAR); // 123 - доступ есть - потому что идет запись прямо в глобальные объект браузера window
console.log(window.VAR); // 123
// внутри function
function something() {
// локальная объявление внутри функции
var VAR = 123;
console.log(VAR); // 123 - доступ есть
if (true) {
console.log(VAR); // 123 - доступ есть
}
}
// обращение "сверху"
console.log(VAR); // Ошибка! ReferenceError: VAR is not defined
// hostiong var
console.log(i); // undefined
// var i; - всплывет наверх без присвоения (поэтому будет undefined)
var i = 10; // присвоение будет на этой строке
let и const
- Переменные, объявленные с помощью
let
иconst
в глобальной области видимости, не становятся свойствами объектаwindow
, в отличие от var. - Поддержка деструктуризации
- ES6 (использование
let
иconst
позволяют исправить потенциальные ошибка, которые могут возникнуть при использовании var) - Можно изменять значение
- Нельзя переобъявлять
- Область видимости - глобальная, если объявлена наверху
- Область видимости - {}, если объявлена внутри {}
let
// let a; // Можно объявлять let без присвоения
let a = true;
// можно перезаписывать
a = false;
// нельзя переобъявлять
// let a = 123; // будет ошибка Uncaught SyntaxError:
// Identifier 'a' has already been declared
let scope
- Если
let
объявлена на самом верху (вне функций), то доступ к ней есть отовсюду - Если
let
объявлена внутри функции или внутри {}, то доступ к ней будет на любом уровне ниже объявления - Если
let
объявлена внутри функции или внутри {}, а обращение к ней идет "сверху" - будет ошибка!
// внутри {}
if (true) {
let LET = 123;
console.log(LET); // 123 - доступ есть
if (true) {
console.log(LET); // 123 - доступ есть
}
}
// обращение "сверху"
console.log(LET); // Ошибка! ReferenceError: LET is not defined
// внутри function
function something() {
let LET = 123;
console.log(LET); // 123
if (true) {
console.log(LET); // 123
}
}
// обращение "сверху"
console.log(LET); // Ошибка! ReferenceError: LET is not defined
const
- Нельзя объявлять без присвоения
// Нельзя объявлять константу без присвоения значения
// const a; // SyntaxError: Missing initializer in const declaration
const a = true;
// нельзя перезаписывать (если примитивный тип данных)
// Uncaught TypeError: Assignment to constant variable
a = false; // будет ошибка
// нельзя переобъявлять
// Uncaught SyntaxError: Identifier 'a' has already been declared
const a = 123; // будет ошибка
const scope
Такой же как и у let
// внутри {}
if (true) {
const CONST = 123;
console.log(CONST); // 123
if (true) {
console.log(CONST); // 123
}
}
// обращение "сверху"
console.log(CONST); // Ошибка! ReferenceError: CONST is not defined
// внутри function
function something() {
const CONST = 123;
console.log(CONST); // 123
}
// обращение "сверху"
console.log(CONST); // Ошибка! ReferenceError: CONST is not defined
// ПРАВИЛО: если будет перезапись, то используй let, в остальных случаях всегда использую const
// для объектов, массивов и функций использовать всегда const.
// При изменении элементов массивов и объектов ошибки не будет
const someArray = [];
const someObj = {
name: 'John',
age: 25,
};
const someFunc = () => null;
// нельзя переприсваивать весь объект
const someObj2 = {
a: true,
b: false,
};
// TypeError: Assignment to constant variable.
someObj2 = {
a: false,
b: false,
};
// также нельзя заменить новым объектом
someObj2 = {
a: 'abc',
b: 'cba,',
};
// но можно переписывать отдельные поля
someObj2.a = false;
// { a: false, b: true }
console.log(someObj2);
Именование
// ключевые слова var, let, const
// переменная - это коробка
// в переменную можно сохранять любой тип данных, объект, массив или функцию
// Правила именования переменных
// Название переменной должно отвечать на вопрос "Кто?, Что?".
const camelCaseStyle = 123; // JS style
const snake_case_style = 123; // php style
const IS_CONSTANT = 123; // примитивные константы, которые не меняются принято именовать в upper snake case
// valid naming
const valid = '';
const $valid = '';
const _valid = '';
const Valid = '';
const валидное = ''; // но лучше никогда не импользовать в нейминге другие алфавиты кроме латинского
// non-valid naming
const non-valid = ''; // через дефис
const 123non-valid = ''; // начинается с цифры
const valid! = ''; // спец. символы
const %non-valid = ''; // спец символы
const const = ''; // ключевое слово в js
// Ключеыве слова в JS
// ES-2015
// break case class catch const continue debugger default
// delete do elseexport extends finally for function if
// import in instanceof let new return super switch this
// throw try typeof var void while with yield
// for future
// enum await implements package protected static interface
// private public
// old keywords
// abstract boolean byte char double final float goto int
// long native short synchronized transient volatile
// Регист (Регист имеет значения. Все переменные в примере будут разными.)
const something = true;
const Something = true;
const SomeThing = true;
const SOMETHING = true;
"Магические" числа
"Магические числа" - числа в коде без хранения их в переменных, по которым непонятно, что они делают. Поэтому лучше всегда присваивать таким числам переменные.