@qo_0p

Цикл массива фиббоначи или непредсказуемое поведение массива WTF?

В данной конструкции все нормально
var a = [];
var b = [];
var c = [];

a[0] = 1;
b[0] = 1;
for (var i = 0; i < 4; ++i) {
  c = a;
  console.log(c);   // выводит [1] Ок!
  a[0] = a[0] + b[0];
  b = c;
  console.log(c);   // выводит [1] Ок!
}


Но если добавляем цикл, происходит что-то странное!
var a = [];
var b = [];
var c = [];

a[0] = 1;
b[0] = 1;
for (var i = 0; i < 4; ++i) {
  c = a;
  console.log(c);   // выводит [1] Ок!
  for (var j = 0; j < a.length; ++j) {
    a[j] = a[j] + b[j];
  }
  b = c;
  console.log(c);   // выводит [2] ПОЧЕМУ????
}

Помогите разобраться пожалуйста, почему так происходит?
  • Вопрос задан
  • 226 просмотров
Пригласить эксперта
Ответы на вопрос 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
Разбор кода
var a = []; 
var b = [];
var c = [];

a[0] = 1;
b[0] = 1;

for (var i = 0; i < 4; ++i) {
  c = a; 
  for (var j = 0; j < a.length; ++j) {
    a[j] = a[j] + b[j]; //a[j] = c[j] = a[j] + b[j];
  }
  b = c; //b = c = a
  console.log(c);   // выводит [2], потому что c[0] = a[0] = b[0] + a[0] = 1 + 1 = 2
}


Сложные типы, в отличие от простых, передаются по ссылке.
var a = "text", b = a;
b = "Other text"; 
console.log(a, b); //text, Other text

var arr = [], brr = arr;
arr.push("item");
console.log(a[0], b[0]); //item, item


Чтобы скопировать массив, создав при этом новый объект, используйте array.slice().

А вообще, вот решение вашей задачи.
Кстати, интересная по поводу него заметка:
bd7220a135594186a8783be01ad46b21.PNG
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы