-
Notifications
You must be signed in to change notification settings - Fork 0
2. Variables and Types (переменные и типы)
Переменные дают возможность повторного доступа к значениям и долее можно перезаписывать значения, объединять значения. Т.е. стоит воспринимать переменные как контейнеры для хранения значений.
ВАЖНО:
- Все переменные объявляем перед из использованием
- Стараться использовать conts везде, где возможно
- Внутри функции не изменять переменные с внешних областей видимости
3 варианта для названий переменных:
- PascalCase - для названий типов и классов в JS, в этом варианте название переменной всегда начинается с большой буквы, другие слова в этой перемеренной тоже начинаются с большой буквы и пишется слитно.
- DB_PASSWORD - для переменных значений которых известны заранее (например до запуска кода/приложения) и не меняются во время работы, константы.
- camelCase - все остальные переменные которые не попадают предыдущие группы.
ВАЖНО: названия переменных должны быть понятными чтобы было понятно что в эту переменную помещено.
- let - добавлено в ECMAScript 6 и актуально сейчас. Если объявить переменную с помощью let то потом её значение можно будет переоприсвоить.
- const - добавлено в ECMAScript 6 и актуально сейчас. Если объявить переменную с помощью const то потом её значение нельзя переоприсвоить.
- var - появился в самом начале и не рекомендуется использовать.
let a
- это просто объявление переменной
const c = 10
- объявление переменной и присваивание ей значения в одной строке
a = true
- на первой строке let a мы объявили переменную, а на этой присвоили ей значение
ВАЖНО: использовать следует const везде где это возможно и стараться использовать только его.
ПРИМЕЧАНИЕ: лучше объявлять переменные отдельно каждую на своей строке, это делает код читабельнее, но не будет ошибкой и в строку let a, b
Тип переменной определяется типом присвоенного значения.
const a = 10
- 10 это число и тип соответственно число (number) и значит мы можем говорить что переменная a это число
const и = 'abc'
- abc это просто текст значит тип строка (string) и значит мы можем говорить что переменная b это строка
В JS 6 примитивных типов:
- string (строка)
- boolean (логический) - true/false
- number (число)
- null - только одно значение null, используется только если нужно явно самостоятельно указать что у какой-то переменной на данном этапе значение отсутствует (null), но возможно позже оно будет присвоено.
- undefined - тоже как null имеет только одно значение undefined, значение не существует, оно не определено.
- symbol (символ) - с помощью этого типа можно создавать уникальные значения.
При присвоении этих типов это значении и содержится в памяти компьютера
Он один и называется object (объект)
В отличии от примитивных типов если мы присваиваем такой объект переменной, то переменная в памяти будет хранить только ссылку на этот объект - 0х3151 это адрес этого объекта в памяти. Т.е. переменная хранит ссылку на объект в памяти, а сам объект в это время находится в другом месте
Мы можем иметь несколько ссылок в разных местах памяти которые указывают на один и тот же объект. Т.е. мы можем иметь несколько разных переменных в памяти которые ссылаются на один и тот же объект. С примитивными типами так нельзя.
К чему это приводит?
Если м меняем св-ва объекта(а делать это можно сколько угодно раз), и в данном случае не важно как была объявлена переменная const или let, то поменяв св-ва объекта в одной переменной - св-ва поменяются везде.
ПРИМЕР 1:
const objectA = {
a: 10,
b: true
}
const copyOfA = objectA
Берем переменную copyOfA и через точечную запись изменяем св-во а переменной.
copyOfA.a = 20 // тут же поменяется objectA.a -> 20
ПРИМЕР 2: А вот так можно добавлять новое св-во c в переменную. Если такое св-во отсутствует оно будет добавлено и ему будет присвоено значение.
copyOfA.с = 'abc' // тут же поменяется objectA.c -> 'abc'
Есть 2 типа типизаций статическая и динамическая.
В статической типизации перед переменной пишется тип переменной, string и int зарезервированные ключевые слова. И если в таком случае мы попытаемся переприсвоить переменной b значение string то получим ошибку. В данном примере используется не JS, это пример статической типизации.
string a = 'abc'
int b = 10
b = 'xyz' // Error
Эта типизация используется в JS, и в этом случае мы можем сменить тип переменной просто присвоив значение другого типа. JS динамически типизируемый язык.
ПРИМЕР 1:
let a
a = 'abc' // string
a = 10 // number
ПРИМЕР 2: тут создаём функцию a и значение этой переменной становится function вызов функции производиться добавление скобок к переменной a()). Переприсваиваем значение переменной на number, а затем вызываем опять функцию и получаем ошибку Uncaught TypeError: a is not a function.
function a() {
console.log('Hello World')
}
a() // 'Hello World'
a = 10
a() // Uncaught TypeError: a is not a function
ВАЖНО: Именно поэтому надо использовать const где только возможно, это позволит избежать проблем связанных с динамической типизацией.
ПРИМЕР 2: стрелочная функция, объявленная таким образом переменная предотвращает ошибку во время объявления переменной т.е. раньше чем мы вызовем функцию.
const a = () => {
console.log('Hello World')
}
a() // 'Hello World'
a = 10 // TypeError: Assignment to constant variable
a()
footer