2015-02-23 2 views
3

Пример кода приведен из Eloquent Javascript Chapter 4 Упражнение 4.3 (A List).Как это работает для работы цикла?

Почему цикл for в приведенном ниже коде останавливается со средним условием в для цикла, являющегося «узлом»?

function listToArray(list) { 
    array = []; 
    for (var node=list; node; node = node.rest) 
    array.push(node.value); 
    return array; 
} 

list = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } }; 
console.log(listToArray(list)); 
+1

Он остановится, когда узел равен null, так как это вернет значение false что приводит к завершению цикла. – DoctorMick

ответ

4

Во-первых, мы можем написать программу по-другому это будет более понятно

function listToArray(list) { 

    array = []; 
    for (var i=list;i; i = i.rest) 
    { 
    array.push(i.value); 
    alert(array) 
    } 
} 

var listobject = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } }; 

listToArray(listobject); 

Здесь ListObject является object literal и используя цикл for, мы проходим через значения объектного литерала или свойства объектного литерала.

Мы можем взять каждую строку кода

1) listToArray(listobject);

это вызов функции, здесь мы передаем объект в качестве аргумента функции.

2) При выполнении этого кода, то управление переходит к определению функции

function listToArray(list) { ...} 

Здесь список тот же аргумент, что мы передаем в момент вызова функции.

3) array = []; Внутри функции мы объявляем массив, изначально массив не имеет элементов.

4) следующий это наш цикл. for (var i=list;list; i = i.rest)

внутренний цикл сначала мы назначаем var i = list;

означает, что мы приписывать все свойства списка объектов для я

Это означает, что мы можем получить доступ к каждому свойству объекта через i,

пример:

i.value приведет 10

5) следующее условие Условие здесь i и в вашей программе это узел

все имеют тот же смысл в данном случае:

условие будет ложным, когда i имеет нулевое значение, в вашем случае node равна нулю.

6) i=i.rest

это даст свойство объекта или значения объекта.

Пример: listobject.value will result 10

listobject.rest.value will result 20 

listobject.rest.rest.value will result 30 

7) и, наконец, array.push(i.value);

добавить значения в массиве, и в этом наш массив содержит 10,20,30

+0

Благодарим вас за подробный ответ! Мне интересно, как работает метод .rest? Предоставляет ли это свойство listobject.value для работы? Таким образом, это также позволяет работать с listobject.rest? Есть ли документация по этому поводу? –

+1

@EricPark, когда вы назначаете var i = list, тогда все свойство объекта списка присваивается i, тогда мы можем использовать i.object peroperty –

0

Я имел свой же вопрос: мне было непонятно, и я надеялся, что для изучения книги для JavaScript это будет объяснено лучше. Затем я остановился и подумал и пошел со следующим соображением.

Автор: «Ошибка», ИМХО, заключается в простой вещи: вместо того, чтобы просто написать node в качестве второго заявления, которое он мог бы написать node != null, это было бы гораздо более заметным и удобным для преподавания («делать цикл while node is not null ": и так как node имеет значение null только в последней итерации - тогда возвращается false - он остановится там): попробуйте сами, это работает

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