Автор оригинала: FreeCodeCamp Community Member.
Марина Феррейра
В этой статье обсуждается, как различные типы данных JavaScript ведут себя, когда они присваиваются переменной. В зависимости от типа данных память выделяется по-разному для его хранения. Он может зарезервировать новое пространство для хранения копии значения, или она может не создавать копию вообще и просто указывать на существующее значение (ссылка).
Вот мои заметки, сделанные, следуя за JavaScript 30 Курс WES BOS Отказ
Числа, строки и логические
В JavaScript, примитивные типы, такие как undefined
, null
, строка
, Номер
, логический
и Символ
передаются по значению.
let name = 'Marina';let name2 = name;
console.log({name, name2}); >> { name: 'Marina', name2: 'Marina' }
name = 'Vinicius';
console.log({name, name2});>> { name: 'Vinicius', name2: 'Marina' }
Когда переменная Имя
назначается пространство в памяти с адресом 0x001
зарезервировано для хранения этого значения. Переменная Имя
затем указывает на этот адрес. Переменная Имя2
затем установлен на равную Имя
Отказ Новое пространство в памяти, с новым адресом 0x002
выделяется и хранит копию значения, хранящегося в адресе Имя
указывает на.
Итак, когда мы хотим изменить значение Имя
, значение, хранящееся Имя2
Не будет изменен, так как его копия, сохраненная в другом месте.
Объекты и массивы
Объекты в JavaScript передаются посредством ссылки. Когда установлено более одной переменной для хранения либо объект
, массив
или Функция
Эти переменные указывают на то же самое выделенное пространство в памяти.
const animals = ['Cat', 'Dog', 'Horse', 'Snake'];
let animals2 = animals;console.log({animals, animals2});>>{ animals: ['Cat', 'Dog', 'Horse', 'Snake'], animals2: ['Cat', 'Dog', 'Horse', 'Snake']}
animals2[3] = 'Wale';console.log(animals, animals2);>>{ animals: ['Cat', 'Dog', 'Horse', 'Wale'], animals2: ['Cat', 'Dog', 'Horse', 'Wale']}
Когда животные
Установлено для хранения массива, память выделена, а адрес связан с этой переменной. Тогда животные2
установлен на равную животные
Отказ С животные
хранит массив вместо создания копии этого массива и нового адреса в памяти, животные2
просто указан на тот же объект в существующем адресе. Таким образом, любые изменения в животные2
будет отражаться на животные
потому что они указывают на одно и то же место.
Вы увидите то же поведение для объектов:
const person = { name: 'Marina', age: 29};
let femme = person;femme.age = 18;
console.log({person, femme});>>{ person: { name: 'Marina', age: 18 }, femme: { name: 'Marina', age: 18 }}
Копирование объектов и массивов
Поскольку простое задание недостаточно для получения копии объекта, которые могут быть достигнуты другими подходами:
Массива
кусочек()
let animals2 = animals.slice();animals2[3] = 'Shark';
CONCAT ()
let animals3 = [].concat(animals);animals3[3] = 'Tiger';
Распространение (ES6)
let animals4 = [...animals];animals4[3] = 'Lion';
Изменения будут влиять только на изменение объекта:
console.log({animals, animals2, animals3, animals4});>>{ animals: ['Cat', 'Dog', 'Horse', 'Snake'], animals2: ['Cat', 'Dog', 'Horse', 'Shark'], animals3: ['Cat', 'Dog', 'Horse', 'Tiger'], animals4: ['Cat', 'Dog', 'Horse', 'Lion']}
Объекты
назначать()
let human = Object.assign({}, person, { age: 20 });
console.log(person, human);>>{ person: { name: 'Marina', age: 29 }, human: { name: 'Marina', age: 20 }}
Глубокий клон
Важно отметить, что эти методы – это всего лишь один уровень. Для глубоких клонов есть нахмуренный метод. Используйте тщательно.
let femme3 = JSON.parse(JSON.stringify(person));femme3.name = 'Leslie';
console.log(person, femme3);>>{ person: { name: 'Marina', age: 29 }, femme3: { name: 'Leslie', age: 29 }}
использованная литература
- WESBOS – JavaScript 30.
- Вы не знаете JS: Область и замыкания Кайл Симпсон
Первоначально опубликовано marina-ferreira.github.io .