- •Введение в JavaScript
- •Что такое JavaScript?
- •Что умеет JavaScript?
- •Что не умеет JavaScript?
- •В чем уникальность JavaScript?
- •Тенденции развития.
- •Недостатки JavaScript
- •Альтернативные технологии
- •ActiveX/npapi, плагины и расширения для браузера
- •Книги по js, html/css и не только
- •Объектно-ориентированное программирование
- •Уровни поддержки
- •Современный doctype
- •Справочники, и как в них искать
- •Спецификация ecmaScript
- •Спецификации html5
- •Редакторы для кода
- •Лёгкие редакторы
- •Sublime Text: шпаргалка
- •Горячие клавиши
- •Плагины
- •Установка и настройка браузеров
- •Установка
- •Включите консоль
- •Просмотр ошибок
- •Включаем отладку
- •Просмотр ошибок
- •Другие браузеры
- •Как поставить несколько версий браузеров?
- •Привет, мир!
- •Внешние скрипты
- •Структура кода
- •Команды
- •Комментарии
- •Переменные
- •Переменная
- •Аналогия из жизни
- •Копирование значений
- •Важность директивы var
- •Константы
- •Имена переменных
- •Зарезервированные имена
- •Правильный выбор имени
- •Имена переменных
- •Имена переменных
- •Зарезервированные имена
- •Правильный выбор имени
- •Введение в типы данных
- •Типы данных
- •Основные операторы
- •Термины: «унарный», «бинарный», «операнд»
- •Арифметические операторы
- •Присваивание
- •Приоритет
- •Побитовые операторы
- •Вызов операторов с присваиванием
- •Оператор запятая
- •Операторы сравнения и логические значения
- •Логические значения
- •Сравнение строк
- •Сравнение разных типов
- •Строгое равенство
- •Сравнение с null и undefined
- •Комментарии
- •Добавить комментарий
- •Комментариев: (14)
- •Побитовые операторы
- •Формат 32-битного целого числа со знаком
- •Список операторов
- •Описание работы операторов
- •& (Побитовое и)
- •| (Побитовое или)
- •Операторы битового сдвига
- •Применение побитовых операторов
- •Описание доступов
- •Проверка доступов
- •Маски в функциях
- •Округление
- •Проверка на -1
- •Умножение и деление на степени 2
- •Взаимодействие с пользователем: alert, prompt, confirm
- •Особенности встроенных функций
- •Комментарии
- •Добавить комментарий
- •Комментариев: (32)
- •Условные операторы: if, '?'
- •Оператор if
- •Преобразование к логическому типу
- •Неверное условие, else
- •Несколько условий, else if
- •Оператор вопросительный знак '?'
- •Несколько операторов '?'
- •Нетрадиционное использование '?'
- •Логические операторы
- •Короткий цикл вычислений
- •Значение или
- •Циклы while, for
- •Цикл while
- •Цикл do..While
- •Цикл for
- •Директивы break и continue
- •Выход: break
- •Следующая итерация: continue
- •Конструкция switch
- •Синтаксис
- •Пример работы
- •Группировка case
- •Тип имеет значение
- •Функции
- •Объявление
- •Локальные переменные
- •Внешние переменные
- •Параметры
- •Аргументы по умолчанию
- •Стиль объявления функций
- •Возврат значения
- •Выбор имени
- •Рекурсия, стек
- •Реализация pow(X, n) через рекурсию
- •Контекст выполнения, стек
- •Задачи на рекурсию
- •Методы и свойства
- •Пример: str.Length, str.ToUpperCase()
- •Пример: num.ToFixed
- •Всё вместе: особенности JavaScript
- •Структура кода
- •Переменные и типы
- •Взаимодействие с посетителем
- •Особенности операторов
- •Логические операторы
- •Конструкция switch
- •Функции
- •Методы и свойства
Циклы while, for
Цикл while
Цикл do..while
Цикл for
При написании скриптов зачастую встает задача сделать однотипное действие много раз.
Например, вывести товары из списка один за другим. Или просто перебрать все числа от 1 до 10 и для каждого выполнить одинаковый код.
Для многократного повторения одного участка кода - предусмотрены циклы.
Цикл while
Цикл while имеет вид:
while (условие) { |
|
// код, тело цикла |
|
} |
Пока условие верно — выполняется код из тела цикла.
Например, цикл ниже выводит i пока i < 3:
var i = 0; |
|
while (i < 3) { |
|
alert(i); |
|
i++; |
|
} |
Повторение цикла по-научному называется «итерация». Цикл в примере выше совершает три итерации.
Если бы i++ в коде выше не было, то цикл выполнялся бы (в теории) вечно. На практике, браузер выведет сообщение о «зависшем» скрипте и посетитель его остановит.
Бесконечный цикл можно сделать и проще:
while (true) { |
|
// ... |
|
} |
Условие в скобках интерпретируется как логическое значение, поэтому вместо while (i!=0) обычно пишут while (i):
var i = 3; |
|
while (i) { // при i=0 значение в скобках будет false и цикл остановится |
|
alert(i); |
|
i--; |
|
} |
Цикл do..While
Проверку условия можно поставить под телом цикла, используя специальный синтаксис do..while:
do { |
|
// тело цикла |
|
} while (условие); |
Цикл, описанный, таким образом, сначала выполняет тело, а затем проверяет условие.
Например:
var i = 0; |
|
do { |
|
alert(i); |
|
i++; |
|
} while (i < 3); |
Синтаксис do..while редко используется, т.к. обычный while нагляднее — в нём не приходится искать глазами условие и ломать голову, почему оно проверяется именно в конце.
Важность: 3
Какое последнее значение выведет этот код? Почему?
var i = 3; |
|
|
|
while(i) { |
|
alert(i--); |
|
} |
Решение
[Открыть задачу в новом окне]
Цикл for
Чаще всего применяется цикл for. Выглядит он так:
for (начало; условие; шаг) { |
|
// ... тело цикла ... |
|
} |
Например, цикл ниже выводит значения от 0 до 3 (не включая 3):
var i; |
|
|
|
for (i=0; i<3; i++) { |
|
alert(i); |
|
} |
Начало i=0 выполняется при заходе в цикл.
Условие i<3 проверяется перед каждой итерацией.
Шаг i++ выполняется после каждой итерации, но перед проверкой условия.
В цикле также можно определить переменную:
for (var i=0; i<3; i++) { |
|
... |
|
} |
Любая часть for может быть пропущена.
Например, можно убрать начало:
var i = 0; |
|
for (; i<3; i++) ... |
|
Можно убрать и шаг:
var i = 0; |
|
for (; i<3; ) { |
|
// цикл превратился в аналог while (i<3) |
|
} |
|
А можно и вообще убрать все, получив бесконечный цикл:
for (;;) { |
|
// будет выполняться вечно |
|
} |
При этом сами точки с запятой ; обязательно должны присутствовать, иначе будет ошибка синтаксиса.
for..in
Существует также специальная конструкция for..in для перебора свойств объекта.
Мы познакомимся с ней позже, когда будем говорить об объектах.
Важность: 4
Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.
Префиксный вариант
var i = 0;
while (++i < 5) alert(i);
Постфиксный вариант
-
var i = 0;
while (i++ < 5) alert(i);
Решение
[Открыть задачу в новом окне]
Важность: 4
Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.
Постфиксная форма:
for(var i=0; i<5; i++) alert(i);
Префиксная форма:
-
for(var i=0; i<5; ++i) alert(i);
Решение
[Открыть задачу в новом окне]
Важность: 1
Посмотрите страницу tutorial/intro/source/loop.html.
Перепишите код, заменив цикл for на while, без изменения поведения цикла.
Решение
[Открыть задачу в новом окне]
Важность: 5
Напишите цикл, который предлагает prompt ввести число, большее 100. Если посетитель ввел другое число — попросить ввести еще раз, и так далее.
Цикл должен спрашивать число пока либо посетитель не введет число, большее 100, либо не нажмет кнопку Cancel (ESC).
Предполагается, что посетитель вводит только числа.
Пример работы.
Решение
[Открыть задачу в новом окне]
‹ Логические операторы Директивы break и continue ›
01.11.2010
Илья Кантор
Александр
var answ = 1; while ( (answ = prompt('Введите число больше 100', 100)) <= 100 && answ ) {}
Катерина Червенкова
Я попробовала все возможные варианты решения задачи:
var i = 0; while (i < 3) { alert(i++); }
http://learn.javascript.ru/pla...
Обнаружилось, что - первые два аналогичны по результату (потому что постфиксная форма возвращает сначала старое значение, потом новое), причём вариант с i++ короче; - а вторые два различаются: первый выводит сразу новое значение (что закономерно), и даже одно выходящее за границы условия (3), поэтому такая форма записи для решения не подходит; а второй выводит сперва старое, потом новое, то есть в принципе аналогичен первым двум. Итого: оптимален самый первый вариант.
Влад
<script type="text/javascript"> var i = 0; while (i < 3) { alert("number " + i + "!"); i++ } </script>
Nikamir
for(i=0; i<100 && i!=null;){i = prompt('Number?','')}
almariel2
Я, конечно, не так сделала, но почему-то результат условиям соответствует
var numb = prompt ('Введите число больше 100', ''); while (numb < 100 ) { var numb = prompt ('Введите число больше 100', ''); }
Александр Белец
нет проверки на null, плюс, дважды одна команда повторяется, чего можно было бы избежать в do...while. Речь идет о красоте кода, однако, на нее полезно ориентироваться, полагаю, для систем с высокой нагрузкой.
GrafMonteKristo
Вдоволь постебавшись над циклом for, я понял, что это некий гибрид управляющей конструкции, блока, задающего переменные и трёх (!!) вспомогательных блоков с действиями. Посмотрите на скрипт - повеселитесь от души! =)
Александр Белец
интересно, сколько будет итераций у цикла for(i++;i++<10;i++){console.log(i);}
GrafMonteKristo
Ты читать умеешь или нет? Я же русским языком написал "любое присвоение КРОМЕ любой формы -крементов".
Александр Белец
Эй, полегче, я тебе не брат или сестра, чтобы так фамильярничать. Уберем из первого блока инкремент, хорошо. Каков ответ на такой вопрос? Сколько будет в итоге итераций, каков будет их порядок? Интереса это почти не снижает.
Го
От 1 до 5.
var i = 0;while (i++ < 5) alert(i);
Первое значение: i=1. Остановимся на нём подробнее. Оператор i++увеличивает i, возвращая старое значение, так что в сравнении i++ < 5 будет участвовать старое i=0.А почему 0 не выведет?
Artur Trvd
var i = 0;while (i++ < 5) alert(i); при сравнении: (i++ < 5) сначала сравнивает 0 < 5 потом увеличивает но на 1, а когда идёт в тело цикла в i уже значение 1 вот он и выводит 1
Artur Trvd
потом увеличивает ноль на 1*
сори клавиши на клаве западают)
Mel1
А можно так про 100 написать?
var num=0; while (num != null && num=prompt('Введите число больше 100',0) <= 100 ) ;
ПавелСурж
Я решил задачу про больше ста так: <title></title><meta charset="utf-8"><script>var a = 1;while (a <= 100) {a = prompt('Введите число большее 100.','');}</script>
David
Да, не помешало бы итога в конце главы и заданий по всему что было в этой главе! тогда все хорошо закрепится и запомнится)
Baizer
1var i = 3;2 3while(i) {4 alert(i--);5} РешениеОтвет: 3,2,1.А не 1.
Андрей Гладков
Я только начал изучать язык по данному ресурсу. Последнюю задачу решил так:
for (var i=0; i<100&& i!=null; i =prompt('enter the namber > 100','')) {}Спасибо за замечательный ресурс:)!
palehorse
Очень кривое решение, которое, во-первых, противоречит самой природе цикла for (for использует переменную-счетчик, которая в пределах цикла должна использоваться лишь для подсчета количества итераций, а не для сохранения значений каких-либо выражений), во-вторых, затрудняет читаемость кода, в-третьих, работает некорректно (попробуйте, используя этот код, ввести не число). Циклы while и do-while существуют не для красоты, пользуйтесь ими, это как раз подходящий случай. Учитесь с самого начала решать задачи правильно во всех смыслах.
palehorse
Прошу прощения насчет третьего пункта, не дочитал условие задачи до конца :)
Андрей Гладков
Тогда как я понимаю должно быть в током виде:
for (var i=0; i<100&& i!=null; ) { i =prompt('enter the namber > 100','') }Спасибо за обратную связь.
Андрей Гладков
Прочитал еще раз:) вот так вот поторопился... и понял что речь шла и об имени переменной тоже.. т.е такой вид можно считать корректным : for (var num = 0; num<100&& num!=null; ) { num =prompt('Введите число больше 100','') }
Андрей Гладков
Вот опять прочитал и из ваших слов, вижу что цикл For только считает количество итераций а не для сохранения значения.. Но значение полученное в результате выполнения цикла for можно вывести.. ( в теории? или я ошибаюсь?).Что то я окончательно запутался..
Для изучения пользуюсь только этим ресурсом..
Dimitry Lapynow
Отличная глава, спасибо!
Скучаю по итогам в конце главы, как было в некоторых ранее, что бы укомплектовать информацию и закрепить материал.
Volya Pers
Почему етот код не работает?о_О do { var numbr=promt("Введите число больше 100 и всё будет нормас",""); } while(numbr<=100 && numbr!=null);
ATi
Потому что promt is not definedОчепятка))
Volya Pers
Почему етот код не работает?о_О
do { var numbr=promt("Введите число больше 100 и всё будет нормас",""); } while(numbr<=100 && numbr!=null);
Сергей
У меня работает такой код: <script> do { var num=prompt('Введите число, большее 100',''); if (num<=100&& num!=null) { alert ('Вы ввели число, меньше 100. Попробуйте еще раз )'); } } while (num<=100 && num!=null); alert ('Введенное Вами число - '+num);</script> Только как сделать, чтобы откидывало все символы кроме цифр?
Dennis
Последняя задача – просто потрясающая (по крайне мере – для чайника, вроде меня).Во-первых, хочу сказать, что фраза в последнем предложении решения задачи «при вводе null» создает впечатление, что имеется ввиду введение строки « null» в промпт. Может написать «при возращении промптом значения null»…Во-вторых, данная задача отлична помогла еще раз уяснить, что такое специальное значение null и в чем различия работы логических операторов ИЛИ и И.И в-третьих, я не совсем понял алгоритм сброса цикла при введении строки. Получается, что при введении строки сравнение num <= 100 дает false, но почему именно? Не может же быть, что любая буква больше цифры сто, или может?
Dennis
Методом проверки всех вариантов сравнения разобрался, почему строка дает False и обрыв цикла: во всех сравнениях с цифрой строка дает False, кроме сравнения “НЕ равно”.
Также прочитал еще раз раздел «операторы сравнения» и понял почему Null дает True в данном сравнении (так как Null приводится к нулю).
А вот с пустой строкой, вернувшейся из промпта – не понятно.
Если пустую строку, вернувшуюся из промпта, сравнить (пустая строка<1) то будет True, поэтому цикл повторяется. Но ведь должно вернутся Ubdefined, которое как сказано в разделе «операторы сравнения» «При преобразовании в число undefined становится NaN … А значение NaN по стандарту устроено так, что любые сравнения с ним возвращают false». Непонятно…
PS Сравнивал Ubdefined, полученную в такой ситуации: var num; alert(num<1); и, да, дает False, как и положено…
Dimitry Lapynow
Функция prompt возвращает тип String, а при сравнении строки с числом выдается значение false. И если вписать любое символьное значение(включая 'null'), то получим false и прерывание цикла.
Пустая же строка приравнивается к 0, что подходит по условию цикла, поэтому прерывания не вызывает.
Fenix-2750
var num=prompt('Введите число, большее 100', '0'); do { var num = prompt("Введите число больше 100?", 0); } while(num <= 100 && num != null); alert('Верно!');
Это скрипт, данный в решении. Если два раза нажать на "Отмена", цикл прекращается и выводит "Верно!". А если сделать проще, например, вот так:
var num=prompt('Введите число, большее 100', '0');while(num<=100) { var num = prompt("Введите число больше 100?", 0);} while(num <= 100 && num != null);alert('Верно!');
или так:
var num=prompt('Введите число, большее 100', '0');for(; num<=100; ) { var num = prompt("Введите число больше 100?", 0);} while(num <= 100 && num != null);alert('Верно!');то будет работать до тех пор, пока не введете число, большее 100.
Vir2alex
Объявлять одну и ту же переменную много раз, это хорошо?
Patch
особого смысла в этом нет, да и считается плохим тоном.
Ag-velichko
последняя задача еще проще: var i=prompt('Введите число','');for(;i<=100&&i!=null; ){i=prompt('Введите число','');}
shamash
Тогда уж и var внутрь for: for(var i=prompt('Введите число','');i<=100&&i!=null; ){i=prompt('Введите число','');}
Verasiavka
Меня интересует тот же вопрос, что и Катюшу Гриценко
Во второй части задания "Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом." (в решении) указано объяснение, почему первое значение i=1 вот так:
"Первое значение - i=1, по той же причине."
Тоесть, исходя из объяснений по первому циклу, причина вот такая:"Первое значение - i=1, так как первым выполнится сравнение ++i < 5. При этом i будет уже увеличена до 1." (т.е.1<5)зы. СНАЧАЛА увеличение i на 1, ПОТОМ сравнение этого увеличенного i=1 и 5.
Но, если я все правильно поняла, то это объяснение не подходит для второго цикла. Оно должно быть примерно таким:"Первое значение - i=1, так как первым выполнится сравнение i++ < 5. При этом i будет равно 0, т.е. 0<5 - условие выполняется. После этого i увеличивается на единицу и становится равным 1, т.е. алертом выводится уже 1."зы. СНАЧАЛА сравнение начального i=0 и 5, ПОТОМ увеличение i на 1.
Объясните, если я не права :)
Roman Skritskiy
Вы правы, во второй части первого примера фраза "Первое значение - i=1, по той же причине" неверна. Первым значением будет 0, он сравнивается с 5, потом i увеличивается и выводится 1.
Box4sawa
Мой вариант: <script> var a = true while(a) { var number = prompt('Enter the number more than 100'); if(number > 100 || number == null) a = false; }</script>
Мне н
