Javascript Array регистрация путаницы - PullRequest
0 голосов
/ 16 марта 2012

Я заметил кое-что, чего вообще не могу понять. Я делаю что-то действительно простое в JavaScript:

var a = [1,2,3];

console.log(a.push(4));
console.log(a);
console.log(a.push(5));

Я ожидаю, что консоль будет регистрировать: 4, [1,2,3,4] и 5, как описано здесь , например. Подвох в том, что фактический вывод консоли выглядит так: 4, [1,2,3,4,5] и 5

См .: http://jsfiddle.net/HknMF/

Что на земле заставляет 5 появляться во втором лог-выходе?

РЕДАКТИРОВАТЬ : вот скриншот Firebug, показывающий оба поведения: http://i.imgur.com/fwAK3.png

1027 *

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Консоль в некоторых браузерах использует ссылку на массив / объект, поэтому при ее проверке и изменении объекта после вызова console.log() вы увидите измененный объект.

В Firefox это такжепроисходит для объектов, но не для массивов, которые все равно отображаются в строке:

>>> var a = [1,2,3]; console.log(a.push(4)); console.log(a); console.log(a.push(5));
4
[1, 2, 3, 4]
5

Специально для объектов, которые не содержат функций, быстрый обходной путь - это клонирование их (log $.extend({}, yourObject), если у вас есть jQuery) или ведение журналаих строковая версия JSON (тогда вы потеряете красивый вид объекта и просто получите простую строку).Массив можно легко клонировать (мелкое копирование!), Используя a.slice(0)

1 голос
/ 16 марта 2012

В зависимости от браузера, ваш живой массив регистрируется (Chrome) или строковое представление (Firefox).

Для предотвращения этого достаточно мелкой копии. Использование:

console.log( a.slice(0) );

за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...