Jump to content
  • 0

Интересное использование цикла for


Bumblebee
 Share

Question

Читаю учебник, наткнулся на пример.

Вот код:

function tail(o) {

for(; o.next; o = o.next)

return o;

}

Вот описание:

В данном примере цикл for используется для обхода связанного списка структур данных и получения последнего объекта в списке (например, первого объекта, который не имеет свойства next).

Никак не могу понять, как работает данный код sad.gif

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

:mellow: незнаю что это но по логике: идет себе цикл проверяет все по порядку до того элемента у которого есть свойство next, идет смотрит ага тут есть next и тут есть next, а вот тут уже нету next значит заканчиваем считать выведем этот элемент... но походу я неправильно понимаю синтаксис :D

конечно разумнее было бы показать на примере блок схемы...

что за учебник можно поинтересоваться ?

Edited by Bobikys
Link to comment
Share on other sites

  • 0

Читаю учебник, наткнулся на пример.

Хорош учебник, если приводит примеры с ошибками. Пример не работает, т.е. всегда возвращает переданный функции параметр, а не последний объект в списке. А вот если поставить после цикла точку с запятой, то тогда работает правильно

function tail(o) {

for(; o.next; o = o.next) ; // тут добавлена точка с запятой

return o;

}

но все равно так писать не надо, не лучший стиль.

Я бы писал так:

function tail(o) {

while( o.next )

o = o.next;

return o;

}

идет себе цикл проверяет все по порядку до того элемента у которого есть свойство next,

Нифига он не идет, а возвращает значение на первой же итерации. Видимо, автор учебника ошибочно полагал, что интерпретатор сам вставит точку с запятой после цикла (как он это иногда делает, но НЕ после цикла). Так что команда return o находится внутри цикла, и больше одной итерации цикла выполнено быть не может.

Edited by rgl
Link to comment
Share on other sites

  • 0

:mellow: после этого комента понял начинается цикл с элемента *о* имеющего свойство next цикл идет до до элемента имеющего свойство next т.е. если но цикл дошел до максимума (условие выполнено (не можем присвоить новое значение элементу *о* т.к. у него нету свойства next)) значит выводим текущее значение *о*

если сразу же не выполняется условие то переменной хранящей результат не присваивается следующее значение т.к. у нее просто нету свойства next и нечего присваивать - следовательно условие проверки выполнено и выводится текущее значение *о* но это в идеале на самом деле возможно будет выдана ошибка или некорректно работать в данном случае счетчик

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

Link to comment
Share on other sites

  • 0

Извините, точка с запятой там есть. У меня просто djvu, переписал коряво :( Учебник Флэнагана, 6-е издание. Насколько знаю, один из лучших по JS. Все подробно. Вот это первый скрипт, приведенный там, который вызвал затруднение. Из двух комментариев мало что понял, видимо еще слабый мозг.

function tail(o) {

while( o.next )

o = o.next;

return o;

}

Разберем тогда его. Если у переданного функции параметра нет свойства "next", то цикл не выполняется ни разу и функция возвращает переданный параметр "o". Это я понял. А что если есть? Тогда получается выполняется инструкция o = o.next. А дальше? Дальше я не понял :(

Link to comment
Share on other sites

  • 0

Если у переданного функции параметра нет свойства "next", то цикл не выполняется ни разу и функция возвращает переданный параметр "o". Это я понял. А что если есть? Тогда получается выполняется инструкция o = o.next. А дальше? Дальше я не понял :(

Вполняется инструкция o = o.next и теперь переменная o указывает не на тот объект, что вначале, а на следующий. Потом все повторяется еще раз, и так до тех пор, пока следующий есть. Как только следующего нет, так цикл заканчивается, и возвращается тот самый объект, у которого нет следующего, т.е. последний.

Link to comment
Share on other sites

  • 0

Выполняется инструкция o = o.next.

Здесь o - объект

next - свойство объекта "o"

И теперь объекту присваивается значение его свойства.

"теперь переменная o указывает не на тот объект, что вначале, а на следующий". Я вот это не могу понять. Как выбирается следующий объект? Ведь мы присваиваем объекту "o" значение его свойства "next"

Link to comment
Share on other sites

  • 0

тоже вот сижу думаю, а где автор книги взял свойство next и как оно указывает на следующий объект? )) Ответ у меня лишь один - речь идет о пользовательском объекте, где всем объектам кроме последнего присвоено свойство next являющееся ссылкой на следующий объект.

Если честно создавать такой объект вручную по-моему глупо, да и не сомсем понятно о чем писал автор книги. Мне кажется речь идет о итераторах, где некое свойство передвигает указатель на следующий объект, но есть одно но )) Iterator(obj) сейчас вроди бы поддерживается только в firefox и там его метод next() работает немного по другому.

Короче не очень понятно вообще о чем речь в книге идет.

Link to comment
Share on other sites

  • 0

тоже вот сижу думаю, а где автор книги взял свойство next и как оно указывает на следующий объект? )) Ответ у меня лишь один - речь идет о пользовательском объекте, где всем объектам кроме последнего присвоено свойство next являющееся ссылкой на следующий объект.

Если честно создавать такой объект вручную по-моему глупо, да и не сомсем понятно о чем писал автор книги. Мне кажется речь идет о итераторах, где некое свойство передвигает указатель на следующий объект, но есть одно но )) Iterator(obj) сейчас вроди бы поддерживается только в firefox и там его метод next() работает немного по другому.

Короче не очень понятно вообще о чем речь в книге идет.

Вот. Дело в том, что этот пример приводится на начальном этапе, как пример использования цикла for. Глава с объектами идет дальше, я потому и озадачился, что это за свойство такое next.

Link to comment
Share on other sites

  • 0

Проще показать на работающем примере, чем объяснять.

// создаем несколько объектов

var o1 = {}, o2 = {}, o3 = {}, o4 = {}, o5 = {};

// чтобы легче было за ними следить, даем им имена

o1.name = "o1";

o2.name = "o2";

o3.name = "o3";

o4.name = "o4";

o5.name = "o5";

// выстраиваем объекты в цепочку. Пусть свойство next каждого объекта указывает на следующий в цепочке

o1.next = o2;

o2.next = o3;

o3.next = o4;

o4.next = o5;

// o5.next ничего не присваиваем, он последний, т.е. следующего нет

function tail(o) {

while( o.next ) {

alert( "заменяем "+o.name+" на "+o.next.name );

o = o.next;

}

alert( "возвращаем " + o.name );

return o;

}

tail( o1 );

Bumblebee, рекомендую в качестве упражнения проделать то же с функцией, как она написана в книжке, т.е. также проверить ее работу по шагам.

Link to comment
Share on other sites

  • 0

Вот-вот, странно только то, что:

Вот. Дело в том, что этот пример приводится на начальном этапе, как пример использования цикла for. Глава с объектами идет дальше, я потому и озадачился, что это за свойство такое next.

ЗЫ Все таки стоит наверное поискать другую книгу другого автора, где все идет по порядку, а не сикось накось )))

Link to comment
Share on other sites

  • 0

И зачем новичку, который еще не дошел до главы про объекты

В данном примере цикл for используется для обхода связанного списка структур данных и получения последнего объекта в списке (например, первого объекта, который не имеет свойства next).

Link to comment
Share on other sites

  • 0

И зачем новичку, который еще не дошел до главы про объекты

В данном примере цикл for используется для обхода связанного списка структур данных и получения последнего объекта в списке (например, первого объекта, который не имеет свойства next).

Это была цитата из учебника :) Все равно спасибо. Материала и примеров теперь куча, приму к сведению :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy