назначенные объекты с использованием расширенного синтаксиса `…` и равно `=`

1

Есть ли разница, если я назначаю объект с помощью = или ...

var o1 = {
    a:1,
    b:2
}

var o2 = o1; //say style 1
var o3 = {...o1} //say style 2

Имеет ли значение, пользуюсь ли я стилем 1 или стилем 2?

Теги:

3 ответа

1
Лучший ответ

Да, есть разница

var o2 = o1; //say style 1

В style1 o2 будет указывать на o1 и менять что-либо в одном отражении изменений в другом. Так как 02 относится к одному объекту.

var o3 = {...o1} //say style 2

В style2 o3 есть новая переменная, которая будет иметь такое же значение, но не будет ссылаться на o1. при изменении o1 ничего не изменится в o3 и наоборот

1

Оператор Spread выполняет одноуровневое глубокое клонирование вашего объекта и, следовательно,

var o1 = {
    a:1,
    b:2
}

var o3 = {...o1} 

будет возвращать новый объект, который не ссылается на o1 где, когда вы пишете var o3 = o1 вы назначаете ссылку с o1 на o3, и поэтому, если вы измените значение say o3.a = 2, оно изменится для исходный объект тоже, тогда как он не будет для первого случая

var o1 = {
        a:1,
        b:2
    }
    var o2 = {
        a:1,
        b:2
    }
    
var o3 = {...o1} 
var o4 = o2;

o3.a = 2;
console.log(o3, o1);

o4.a = 4;
console.log(o2, o4);
0

Имеет ли значение, пользуюсь ли я стилем 1 или стилем 2?

Да, ваш стиль1 и стиль2 по существу делают две разные вещи.

style1 назначает ссылку o1 на o2, поэтому

o1 == o2 // true

style2, с другой стороны, присваивает значения o1 o3 и создается новый объект, поэтому

o1 == o3 // false

Ещё вопросы

Сообщество Overcoder
Наверх
Меню