#javascript #jquery
#javascript #jquery
Вопрос:
Рассмотрим объект с именем, obj
который, как я полагаю, равен {x: 1, y: 'hi'}
(он был определен некоторое время назад и претерпевал некоторые модификации с помощью различных функций на протяжении всего своего срока службы).
console.log(obj);
console.log(obj.y);
console.log(obj.x);
Результат этого как в Chrome, так и в FF3.6 показывает результат console.log(obj)
как
obj = {x: 1, y: 'hi'}
как и ожидалось. Результат obj.y
печатается hi
, как и ожидалось, но результат obj.x
печатается 0
.
Я не понимаю, как это несоответствие может произойти. Он печатает правильно как объект в целом, но затем в самой следующей строке печатает другое значение при непосредственном обращении к параметру.
Я предполагаю, что это как-то связано со структурой общего объекта, потому что я определяю obj
и сохраняю ее в массиве arr
. Затем я помещаю obj
в элемент DOM, используя .data()
функцию jQuery. Позже я извлекаю объект с помощью .data()
элемента DOM и еще немного изменяю объект (в частности, параметр x
). Странности, которые я наблюдаю, происходят, когда я позже получаю доступ к объекту из arr
.
В основном, я просто хочу понять, почему консоль.журнал показывает несоответствие
Комментарии:
1. Невозможно сказать без какой-либо живой демонстрации. Если я создаю подобный объект,
obj.x
печатается1
. Т.е. я не могу воспроизвести ошибку… пожалуйста, предоставьте демонстрацию проблемы.2. Я не думаю, что у меня достаточно информации, чтобы понять, что происходит не так. Из того, что вы описываете, вы должны получать ссылки на один и тот же объект при доступе к нему с помощью .data() или извлекать его из массива. Какие именно манипуляции вы производите с obj.x?
3. @Jesse точно так же, как obj.x = 2 или что-то в этом роде
Ответ №1:
Когда вы извлекаете объект из «.data()», вы не получаете копию объекта — вы получаете сам объект. Существует только один. Таким образом, если вы сделаете это:
$('#foo').data('obj', { x: 1, y: "hi" });
и затем:
var obj = $('#foo').data('obj');
// ...
if (whatever) obj.x = 0;
затем, позже, когда вы снова будете ссылаться на «obj» через «.data()», свойство «x» будет равно нулю (если в данном случае условие «if» было истинным).
Вы можете избежать этого, создав копию данных самостоятельно, если, конечно, вам нужна копия.
Комментарии:
1. конечно, но есть идеи о том, почему консоль. журнал показывает два разных результата, основанных на том, как я указываю ему печатать?
2. Я не могу повторить этот опыт, поэтому вы, должно быть, делаете что-то еще, что вы не описали. Когда я делаю именно то, что вы предложили, я получаю ожидаемые ответы, напечатанные Chrome (то есть «x» равно 1 в обоих вариантах).