Что такое изменяемое значение?
Изменяемое значение — это значение, которое можно изменить без создания совершенно нового значения. В JavaScript объекты и массивы по умолчанию изменяемы, а примитивные значения — нет — после создания примитивного значения его нельзя изменить, хотя переменная, которая его содержит, может быть переназначена.

Что такое неизменяемое?
Неизменное значение — это значение, содержание которого нельзя изменить без создания совершенно нового значения.

ПРИМИТИВЫ В Javascript

В JavaScript примитив (примитивное значение, примитивный тип данных) — это данные, которые не являются объектом и не имеют методов или свойств.

Существует 7 примитивных типов данных:

  1. нить
  2. число
  3. большойинт
  4. логический
  5. неопределенный
  6. символ
  7. нулевой

ПРИМЕЧАНИЕ –

У примитивов нет методов, но они ведут себя так, как если бы они у них были. При доступе к свойствам примитивов JavaScript автоматически упаковывает значение в объект-оболочку и вместо этого обращается к свойству этого объекта. Например, «foo».includes(«f») неявно создает объект-оболочку String и вызывает String.prototype.includes() для этого объекта. Это поведение автоматической упаковки не наблюдается в коде JavaScript, но является хорошей ментальной моделью различного поведения — например, почему «мутирующие» примитивы не работают (поскольку str.foo = 1 не присваивается свойству foo самой str, но к эфемерному объекту-оболочке).

let name = "Cat"
name[0] = "M"

console.log(name)
// OUTPUT -> "Cat"

НЕПРИМИТИВЫ В Javascript

В JavaScript непримитив — это объект. Массив, функции также являются объектами, потому что с ними связаны некоторые свойства. Если вы углубитесь в их прототипы, они основаны на прототипе объекта.

let user = {
 name: "John",
 location: "NY"
}
user.name = "Mark"

console.log(user)
// OUTPUT -> { name: "Mark", location: "NY" }

А теперь давайте зададим себе несколько вопросов

  1. Изменяемы ли примитивные типы данных?
  2. Изменяемы ли непримитивные типы данных?

Ответ:

В JavaScript объекты и массивы по умолчанию изменяемы, но примитивные значения — нет — после создания примитивного значения его нельзя изменить.

Таким образом, примитивные значения неизменяемы, а непримитивные значения изменяемы.

Давайте рассмотрим пример –

let name = "John"
name = "Mark"

console.log(name)
// OUTPUT -> "Mark"

Это мутация?
.
.
.
.
.

Да. Но почему?

Это правда, что мы не можем изменять примитивные типы, но здесь мы изменяем переменную посредством переназначения.

Все примитивы неизменяемы; то есть они не могут быть изменены. Важно не путать сам примитив с переменной, которой присвоено значение примитива. Переменная может быть переназначена новому значению, но существующее значение не может быть изменено способами, которыми могут быть изменены объекты, массивы и функции. Javascript не предлагает утилит для изменения примитивных значений.

Итак, чтобы исключить мутацию, мы должны убедиться, что мы не создаем изменяемые переменные. Итак, мы всегда должны отдавать предпочтение объявлению const, если хотим исключить мутации из нашей кодовой базы.

Как устранить мутацию из приведенного выше фрагмента кода?

const name = "John"
name = "Mark" // TypeError: Assignment to constant variable.

ЗАКЛЮЧЕНИЕ -

В JavaScript объекты и массивы по умолчанию изменяемы, а примитивные значения — нет.

Но вы по-прежнему можете изменять переменные путем переназначения.

ПРИМЕЧАНИЕ -

  1. Чтобы устранить область мутации примитивов, убедитесь, что вы создаете переменные с объявлением const.
  2. Чтобы устранить область мутации не-примитивов, убедитесь, что вы создаете новые ссылки, что в конечном итоге уменьшит поверхность для ошибок в вашем коде.

ССЫЛКИ -