jQuery: объект [свойство] .push () изменяет старый объект, если новый создается с помощью jQuery.extend () - PullRequest
2 голосов
/ 24 ноября 2011

Рассмотрим пример кода:

a={};
a['herp']=['derp'];

var b = jQuery.extend({}, a);
b['herp'].push('foo');
alert(a['herp']); //this produces message box with "derp,foo"

Насколько я понимаю, var b = jQuery.extend({}, a); клонирует объект (как упомянул Джон Резиг), т.е. создает новый объект с тем жесвойства как и предыдущий.Если это правильно, то почему b['herp'].push('foo'); изменяет a, как указано alert(a['herp']);?

Пример jsFiddle: http://jsfiddle.net/M48tr/

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Я думаю, что вы должны сделать:

var b = jQuery.extend(true, {}, a);

Fiddle здесь http://jsfiddle.net/M48tr/1/

это потому, что свойство является массивом и вам нужен глубокий клон.Как написано в документации:

Слияние, выполняемое $ .extend (), не является рекурсивным по умолчанию;если свойство первого объекта само является объектом или массивом, оно будет полностью перезаписано свойством с тем же ключом во втором объекте. Значения не объединяются. Однако, передавая true для первого аргумента функции, объекты будутбыть рекурсивно объединенным.

Если вы не делаете глубокое копирование, b['herp'] просто содержит ссылку на массив, который находится в a['herp']

Вещи разные, еслисвойства не являются массивами или объектами, как в этом примере:

a={};
a['herp']='derp';

var b = jQuery.extend({}, a);
b['herp'] = 'foo';
alert(a['herp']);//alerts derp

alert(b['herp']);//alerts foo

скрипка здесь http://jsfiddle.net/M48tr/2

1 голос
/ 24 ноября 2011

Вы должны прочитать более внимательно и использовать Google. В общем Мелкая копия - создается новая "копия". Но указывает на тот же кусок памяти (данные - переменные, константы и т. Д.). Таким образом, представляя «синоним» исходного объекта. И теперь важная вещь - независимо от того, какой из них вы измените, это повлияет на оба.

Глубокая копия занимает больше времени, поскольку все данных исходного объекта копируются в новый объект. 2 объекта имеют одинаковую структуру (вместо того, чтобы указывать на одно и то же). Но изменения коснутся только одного из объектов.

...