2016-03-28 5 views
0
var x = {'a': 't1', 'b': 't2', 'c': 't3'}; 
var y = x; 
delete (y['c']); 
console.log(x); 

Ожидаемый результат:Странное поведение с удаления

Object {a: "t1", b: "t2", c: "t3"} 

Выход:

Object {a: "t1", b: "t2"} 

Есть ли причина, почему удаление свойство объекта изменяется у объекта х?

+5

объекты передаются 'reference' не' value'. Обе переменные указывают на то же место в памяти, поэтому, если какой-либо из них изменится, это в конечном итоге изменит объект. – Rayon

+3

Потому что это точно такой же экземпляр объекта. –

+0

@RayonDabre Тогда, если я хочу иметь объект y без ключа c и не влияя на объект x, как это сделать? – chris97ong

ответ

1

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

Это обычная вещь на большинстве языков программирования, и вам нужно сделать глубокую копию объекта, если вы не хотите изменять x. Вы можете see эту тему.

2

Javascript всегда передается по значению, но когда переменная относится к объекту (включая массивы), «значение» является ссылкой на объект. , поэтому в вашем случае вы передаете его по ссылке.

1

Когда вы назначаете объект другой переменной, это только ссылочный набор. Таким образом, манипулирование либо основным объектом, либо назначенной переменной будет по-прежнему управлять одним и тем же местом памяти. Таким образом, вы должны сделать глубокую копию объекта в переменной, которая создаст новую память для переменной, а затем ее обработает. Здесь вы можете попробовать это.

var y= Object.assign({}, x); 
delete (y['c']); 
console.log(x); 
1

Необходимо скопировать значение, по умолчанию оно берет ссылку.

Метод Object.assign() используется для копирования значений всех перечислимых собственных свойств из одного или нескольких исходных объектов в целевой объект. Он вернет целевой объект.

Сценарии:

var x = {'a': 't1', 'b': 't2', 'c': 't3'}; 
var copy = Object.assign({}, x); 
delete (copy.c); 
console.log(x); 
console.log(copy); 

Выходные:

Object { a: "t1", b: "t2", c: "t3" } 
Object { a: "t1", b: "t2" } 

fiddle link

Смежные вопросы