Несоответствие объектов Javascript

#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 в обоих вариантах).