2016-08-25 10 views
0

В следующем коде я ожидаю, что будет создан 2-мерный массив, предварительно заполненный нулями. Проблема, которую я получаю, заключается в том, что x[0][3] = 2, похоже, происходит слишком быстро, поэтому к моменту входа в консоль внутри функции массив уже имеет измененное значение. Кажется, я не могу это исправить, даже с таймаутами. Что происходит?Почему этот 2d-массив создает неожиданные результаты?

function test(size) { 
    var row = []; 
    var return_me = []; 
    for (var i=0; i < size; i++) { row.push(0); } 
    for (var j=0; j < size; j++) { return_me.push(row.slice()); } 
    console.log("1:"); 
    console.log(return_me); 
    return return_me; 
} 

var x = null; 
console.log("0:"); 
console.log(x); 
x = test(5); 
console.log("2:"); 
console.log(x); 
x[0][3] = 2; 
console.log("3:"); 
console.log(x); 

Неожиданный результат приходит на «1:» на выходе, где я получаю:

0: 0 
1: 0 
2: 0 
3: 2 
4: 0 
+1

Включен ли фактический _error_ или журнал просто выглядит неожиданным? – Xufox

+0

Какие результаты журнала вы обнаружите неожиданными? –

+0

Извините, это вводит в заблуждение: нет ошибок. Я уточняю вопрос с более конкретными особенностями, чтобы быть более ясным. –

ответ

2

Как Массив является объектом, вы увидите реальное (последнее) значение, что, как console.log() показывает ссылку на объект, и к моменту его открытия значение изменилось.

Опция заключается в использовании console.dir() для печати текущего состояния объекта (хотя console.dir() НЕ работает на хроме).

Если вы хотите получить реальное значение в хроме, напечатайте это одно значение, а не весь объект.
Вы можете посмотреть this post для расширенного объяснения и получения дополнительной информации.

+0

Я надеялся, что это что-то вроде этого (не моя функция). Благодаря! –

+0

Да, я думаю, что все, кто кодирует JS, рано или поздно натыкаются на эту вещь. : D –

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

  • Нет связанных вопросов^_^