Навіщо в ES6 const, якщо він не працює?

3 хв. читання

Якщо ви перейшли на JavaScript з якоїсь С-подібної мови, то вас, напевно, збентежить той факт, що перший js-код виконається без проблем, а другий код на С — ні.

const numbers = [1, 2, 3, 4, 6]
numbers[4] = 5
console.log(numbers[4]) // виведе 5 
const int numbers[] = {1, 2, 3, 4, 6};
numbers[4] = 5; // error: read-only variable is not assignable
printf("%d\
", numbers[4]); 

Це виникає тому що в C const оголошує змінну, яку не можна змінювати, в той час як JavaScript зовсім не піклується про іммутабельність. Воно створює іммутабельну привязку, що гарантує, що змінній не нададуть нового значення. Тобто, наступний код викличе помилку:

const numbers = [1, 2, 3, 4, 6]
numbers = [7, 8, 9, 10, 11] // error: assignment to constant variable
console.log(numbers[4])

Щоб краще розуміти концепцію змінних, розглянемо наступний малюнок. В першому стовпчику записано адрес пам'яті, всередині — значення змінної, а справа — назву змінної.

Навіщо в ES6 const, якщо він не працює?

Як ви бачите зі схеми, ідентифікатор змінної пов'язаний з фізичним адресом в пам'яті, в комірці якої і зберігається значення. read-only-змінні не дозволяють модифікувати будь-який з цих параметрів, в той час як read-only-зв'язування даних забороняє лише змінній зберігати інше значення, поточне значення може бути змінено. В JavaScript, наприклад, об'єкт може змінювати себе сам.

Як же зробити дані незмінними?

Примітивні структури даних незмінні по своїй природі. І цей код доводить це:

// Приклад 1
const a = 10
a = a + 1 // error: assignment to constant variable
// Приклад 2
const isTrue = true
isTrue = false // error: assignment to constant variable
// Приклад 3
const sLower = 'hello world'
const sUpper = sLower.toUpperCase() // створює новий рядок
console.log(sLower) // виведе hello world
console.log(sUpper) // виведе HELLO WORLD

Щоб зробити об'єкти іммутабельними можна використати Object.freeze(), але зазвичай це працює лише з об'єктами, які складаються з пар властивість-значення. Тобто, воно не працюватиме з такими даними як Date, Map та Set.

// Приклад 4
const me = Object.freeze({name: "Jacopo"})
me.age = 28
console.log(me.age) // виведе undefined
// Приклад 5
const arr = Object.freeze([-1, 1, 2, 3])
arr[0] = 0
console.log(arr[0]) // виведе -1
// Приклад 6
const me = Object.freeze({
  name: 'Jacopo', 
  pet: {
    type: 'dog',
    name: 'Spock'
  }
})
me.pet.name = 'Rocky'
me.pet.breed = 'German Shepherd'
console.log(me.pet.name) // виведе Rocky
console.log(me.pet.breed) // виведе German Shepherd

Як ви можете побачити з прикладу, вкладені в заморожений об'єкти все ще можна змінювати. Щоб зробити дані дійсно незмінними ви можете написати свій метод заморозки. Або використовувати Immutable.js, звісно, вона не робить стандартні типи іммутабельнимим, але вона надає багато власних незмінних типів даних, включаючи список, стек, хеш-мап, впорядкований хеш-мап, множину, впорядковану множину та інше.

var, let чи const?

В ES6 розробник не повинен використовувати var. Тепер для оголошення звичайних змінних потрібно використовувати let, а для змінних, які не планується перезаписувати — const. Я рекомендую використовувати const за умовчуванням, і лише коли це дійсно потрібно — let.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація