@andreyz40r

Как работает этот js код?

Помогите пожалуйста разобраться. Это решение задачи из книги "Выразительный javascript". Задача на односвязные списки: Напишите функцию arrayToList, которая строит такую структуру, получая в качестве аргумента [1, 2, 3]...

console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}


Почему работает код тела цикла? Разве на каждой итерации переменные не создаются заново?

function arrayToList(arr) {
	for (var i = arr.length - 1; i >= 0; --i) {
		var nextRest = list || null;
		var list = {};

		list["value"] = arr[i];
		list["rest"] = nextRest;
	}

	return list;
}
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Переменные создаются заново, но их содержимое перекидывается туда-сюда и в итоге сохраняется и даже "увеличивается".
Представьте себе переливание воды из ведра в ведро. Вы берёте второе ведро, выливаете в него воду из первого ведра, а потом, добавив в пустое первое ведро кружку спирта, заливаете туда воду обратно из первого ведра.
При этом вы можете выкидывать пустое ведро после того как вылили из него воду и каждый раз покупать новое ведро чтобы налить в него воду.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
В JS есть существует "поднятие" переменных.
Иными словами ваш код равнозначен следующему:
function arrayToList(arr) {
  var i;                 // На самом деле именно здесь определяются все переменные
  var nextRest;          // данной функции объявленные
  var list;              //  через ключевое слово "var"

  for (i = arr.length - 1; i >= 0; --i) {
    nextRest = list || null;
    list = {};

    list["value"] = arr[i];
    list["rest"] = nextRest;
  }

  return list;
}


Если вы хотите чтобы данного поднятия не происходило, то определяйте переменные через ключевое слово let. Для let поднятие переменных не происходит.
Ответ написан
Stalker_RED
@Stalker_RED
Создаются, и соеденяются "цепочкой", так чтобы каждый элемент ссылался на соседний.
В этом и есть смысл односвязного списка.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 30 000 до 65 000 руб.
BSSL Москва
от 50 000 до 150 000 руб.
от 60 000 до 90 000 руб.
19 июл. 2019, в 08:49
35000 руб./за проект
19 июл. 2019, в 07:57
65000 руб./за проект
19 июл. 2019, в 06:36
15000 руб./за проект