Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   как же всё-таки работает while (https://javascript.ru/forum/css-html/70257-kak-zhe-vsjo-taki-rabotaet-while.html)

atanov 23.08.2017 09:39

как же всё-таки работает while
 
не пойму почему не работает while :(

такой незамысловатый скрипт выдаёт кол-во строк в таблице, включая заголовок.

var aaaa = document.getElementsByTagName('tr');
for (var j=0;j<aaaa.length;j++){}
alert (j);


а с while'ом не работает:cray:, браузер виснет:

var j = 0;
var aaaa = document.getElementsByTagName('tr');
while (aaaa){j++;}
alert (j);

laimas 23.08.2017 10:01

https://learn.javascript.ru/traversi...igation-tables

А код полный ахтунг, поэтому и не работает.

ksa 23.08.2017 10:05

Цитата:

Сообщение от atanov
такой незамысловатый скрипт выдаёт кол-во строк в таблице, включая заголовок.

Для определения количества строк достаточно вот такого, более незамысловатого скрипта :D
alert(document.getElementsByTagName('tr').length);

Циклы для этого вообще не нужны. :no:

atanov 23.08.2017 10:35

ksa, laimas,

Да хрен с ним с кодом, я хотел бы разобраться с while'ом и можно ли while'ом, а не for перебрать полученную коллекцию элементов, скажем с тегом tr или td и т.д.

Nexus 23.08.2017 10:37

atanov, можно
/* 
Из рубрики «Как делать не нужно».
Подсчет кол-ва элементов массива.
*/
var i=0;
while(i++<aaaa.length){}

laimas 23.08.2017 10:38

Цитата:

Сообщение от atanov
я хотел бы разобраться с while'ом

Ну так какие проблемы - выводите в консоль состояние итераций, станет понятно в чем бред кода.

atanov 23.08.2017 11:00

Nexus, да это моя проблема, наверное неправильно формулирую.

Главный вопрос - из описания тут https://learn.javascript.ru/while-for
следует, что пока элемент в скобках есть, выполняется тело цикла.
Дословно - "Условие в скобках интерпретируется как логическое значение, поэтому вместо while (i!=0) обычно пишут while (i)".
Очевидно, что в моём случает переменная это объект и как этот объект проверить на true/false, чтобы выполнялось тело цикла? В php например, при переборке массива, который получен путём запроса sql, так сделать можно: while ($row['...']){...}

ksa 23.08.2017 11:06

Цитата:

Сообщение от atanov
можно ли while'ом, а не for перебрать полученную коллекцию элементов

Разумеется можно. :yes:
Главное верно использовать пред или пост условие...

var j = 0;
var a = document.getElementsByTagName('tr');
while (a[j]){j++;}
alert (j);

laimas 23.08.2017 11:07

Цитата:

Сообщение от atanov
php например, при переборке массива, который получен путём запроса sql, так сделать можно: while ($row['...'])

Во-первых в РНР так сделать нельзя, можно while($row = fetch_assoc($result)) и работает это потому, что fetch_assoc() при каждом запросе автоматически сдвигает указатель на следующую строку ресурса, и если следующей строки не существует, то возвращается NULL, цикл заканчивается.

А у вас что? Вы же даже не пытались запустить отладку, чтобы понять в чем у вас проблема, так ведь? Просто упорно веруете, что должно работать, хотя условием задано не понять что.

Nexus 23.08.2017 11:08

Цитата:

Сообщение от atanov
В php например, при переборке массива, который получен путём запроса sql, так сделать можно: while ($row['...']){...}

Таким вайлом вы бесконечный цикл получите, что в php, что (имхо) в большинстве любых других ЯП.

ksa 23.08.2017 11:08

Цитата:

Сообщение от atanov
как этот объект проверить на true/false

Это есть в моем примере. Только проверка не на true/false, а на наличие элемента/объекта...

Цитата:

Сообщение от atanov
В php например, при переборке массива, который получен путём запроса sql, так сделать можно: while ($row['...']){...}

Так и в JS так. :D
Только ты так не стал делать.

ksa 23.08.2017 11:10

Цитата:

Сообщение от laimas
в РНР так сделать нельзя

Цитата:

Сообщение от Nexus
бесконечный цикл получите

Я в ПХП не силен, т.ч. не обессудьте. :cray:

atanov 23.08.2017 11:26

Цитата:

Сообщение от ksa
ksa

Спасибо!

atanov 23.08.2017 11:28

Цитата:

Сообщение от laimas
laimas

Да-да, конечно так, сорри неправильно впечатал. ksa уже объяснил на примере, как должно быть.

laimas 23.08.2017 11:41

Цитата:

Сообщение от atanov
ksa уже объяснил на примере, как должно быть

Должно быть обращение к методам и свойствам объекта TABLE, коли они существуют, то изголяться getElementsByTagName('tr') какой смысл?

ksa вам просто подсказал, а надо было самому глянуть в консоль, и посмотреть, что aaaa, это коллекция, и для цикла булево значение ее всегда будет true, отсюда и бесконечный цикл.

Если судить по аналогии с получением строк ресурса, то типа такого, хотя здесь возвращает false не за счет сдвига указателя в массиве, он всегда будет в конце его, а за счет того, что массив в конечном итоге будет пуст (вернется undefined):

<html>
<body>
<table>
    <tr><td></td></tr>
    <tr><td></td></tr>
    <tr><td></td></tr>
</table>
<script>
var a, b = [].slice.call(document.querySelector('table').rows);
while(a = b.pop()) {
    a.cells[0].innerHTML = 111;
}
</script>
</body>
</html>


Цикл while самый простой, но и медленный, в данном случае его можно заманить на более быстрый:

for( ; a = b.pop() ; ) {

}

atanov 23.08.2017 11:58

Цитата:

Сообщение от laimas
для цикла булево значение ее всегда будет true, отсюда и бесконечный цикл.

Вот это как раз и ответ на мой вопрос. Теперь понятно, почему цикл бесконечным является. Ещё раз спасибо!


Часовой пояс GMT +3, время: 07:56.