2015-05-13 3 views
2

Книга говорит:listToArray Eloquent JavaScript

Чтобы задавить список (в listToArray и п-й), а при описании петли, как это можно использовать:

for (var node = list; node; node = node.rest) {} 

Каждая итерация цикла , узел указывает на текущий подписок, и тело может прочитать его значение, чтобы получить текущий элемент. В конце итерации узел переходит к следующему подсписку. Когда это значение равно null, мы достигли конца списка, и цикл завершен.

Вопрос 1: Не могли бы вы объяснить, как работает условие цикла for? Я понимаю, что он проверяет, является ли узел (текущий список) нулевым. Но как сам дескриптор «узла» работает?

Вопрос 2: почему не работает следующий код?

function listToArray(list){ 
    var result = []; 
    while(list.value != null){ 
     result.push(list.value); 
     list = list.rest; 
    } 
    return result; 
}; 

console.log(listToArray(list)); 
+1

За то, что он стоит в современной JavaScript вы бы сделать список итерации, а не качение собственной схемы итерации. –

ответ

3

Чтобы понять, как это работает, вы должны знать две вещи:

  • How цикла работы ява скрипт For.
  • Что такое truthy значения.

syntax для для оператора цикла:

для ([инициализации]; [состояние]; [окончательное выражение]) оператор

[условие] Выражение быть оценены перед каждая итерация цикла. Если это выражение равно true, выполняется оператор. Если выражение имеет значение false, выполнение переходит к первому выражению , следующего за конструкцией for.

В сценарии Java значение truthy оценивается как true при оценке в булевом контексте.

Все значения являются truthy, если они не определены как falsy (то есть, за исключением для ложно, 0, "", нулевой, не определено, и NaN).

Так до node является null в одной точке, мы may сказать, что node является truthy и оценивается как истина.

В заявлении node = node.rest присваивается значение null, равное node, и выход для цикла цикла.

В приведенном ниже коде не работает, потому что, list.value могут быть undefined, или как факт любого другой falsy значения, отличной от null.

function listToArray(list){ 
    var result = []; 
    while(list.value != null){ 
     result.push(list.value); 
     list = list.rest; 
    } 
    return result; 
}; 

console.log(listToArray(list)); 

вместо этого попробуйте, while(list.value).

2

... но как же "узел" аргумент сам по себе работать?

node является переменной. Переменная разрешена к ее значению. Например. если у меня есть

var foo = 3; 
alert(foo + 1); 

будет решать foo к значению 3, а затем добавить 1 к нему. Аналогично, в этом случае node разрешен к любому его значению, это значение равно , преобразованное в булево значение (то есть Boolean(node)), а затем проверено, является ли оно true или false.

Если значение node равно null, то Boolean(node) вернет false.

Почему не работает следующий код?

Не может сказать, не зная, что такое list и что именно «не работает».

Но предположительно, list.rest является null в какой-то момент, и в этом случае вы попытаетесь получить доступ к null.value, который выдает сообщение об ошибке. Эквивалент версия для цикла for бы сравнить list себя:

while (list != null) 
0

Проще всего использовать: var result = Array.prototype.slice.call (list);

это превратит список в массив

0
function listToArray(listValue){ 
    var arrayResult = []; 

    while(listValue.list){ 
     arrayResult.push(listValue.value); 
     listValue = listValue.list; 
     } 

    arrayResult.push(listValue.value); 

    return arrayResult; 
} 
Смежные вопросы