Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Я учу JavaScript (https://javascript.ru/forum/misc/43357-ya-uchu-javascript.html)

Antarius 02.12.2013 20:45

Я учу JavaScript
 
Здравствуйте, меня зовут Женя и я алкоголик, мне 23 года и я 3д художник. (??ты что тут забыл?)
Уже довольно долго я работаю с 2д/3д/видео/музыкой и т.д., так сказать креативностью.
Но во что то в моей жизни всё таки не хватало. И вот тут то я и познакомился с html 4.01,
css2 и начинаю потихоньку осваивать js(уже неделя).
Почему именно js а не пхп? Ну пхп мне тоже нравится, кажется легким языком,
книжка вот рядом лежит, легко читается, легко понимаю, с моим то правополушарным
сознанием :lol: но js мне как то больше нравится в плане дизайна,
то есть написал скрипт, а он же клиент сайд (может и сервер сайд есть но я еще об этом не знаю),
быстро грузится и графика потрясающая, можно делать красивые вещи.

Ну а теперь главный вопрос. Зачем же мне, человеку который всю жизнь занимался хернёй
искусством, вдруг начал осваивать программирование. Так вот, цель моя совместить все мои навыки
2д, 3д и музыки с программированием, что бы в будущем я мог делать красивые веб приложения,
и очень надеюсь, верю, игрушки.
Собственно всё :D

В основном эта тема будет мой блог+вопрос (извиняюсь если тема не в том разделе).

------------
Сейчас я обучаюсь по видеокурсу Русакова (сцлк) JS.
Прошел: Основы JavaScript, Hello World, Переменные, Типы переменных, Операции, Условные операторы.
И тут у меня возник один вопрос. Код очень длинный, как можно сделать вот это, короче? Вообще можно сделать его короче?))

var age = 23;

		if(age <= 18){
				document.write("За границей говорят что я стар");
			}
			else if (age>18 && age<=30){
				document.write("Да");
			}
			else if (age>31 && age<=50){
				document.write("Я стар");
			}			
			else if (age>51 && age<=80){
				document.write("Я очень стар");
			}
			else if (age > 81){
				document.write("Я superstar");
			}
			else{
				document.write("No age");
			}
	}

Rise 02.12.2013 21:25

document.write((age<19)?'За границей говорят что я стар':(age<31)?'Да':(age<51)?'Я стар':(age<81)?'Я очень стар':'Я superstar');

danik.js 02.12.2013 21:45

Можно придумать некий декларативный способ описания интервалов. Правда получается немаленький оверхед и операторы сравнения фиксированы (хотя можно учесть и это):

var age = 23;

var stages = {
    "За границей говорят что я стар": [-Infinity, 18],
    "Да": [18, 30],
    "Я стар": [30, 50],
    "Я очень стар": [50, 80],
    "Я superstar": [80, Infinity]
};

var message = "No age";
for (var key in stages)
    if (age > stages[key][0] && age <= stages[key][1]) {
        message = key;
        break;
    }
//document.write(message);
alert(message);

Rise 02.12.2013 21:59

Еще вариант:
document.write((age<19)&&'За границей говорят что я стар'||(age<31)&&'Да'||(age<51)&&'Я стар'||(age<81)&&'Я очень стар'||'Я superstar');

Antarius 02.12.2013 22:04

Цитата:

Сообщение от Rise (Сообщение 284126)
Еще вариант:
document.write((age<19)&&'За границей говорят что я стар'||(age<31)&&'Да'||(age<51)&&'Я стар'||(age<81)&&'Я очень стар'||'Я superstar');

Мне второй вариант больше нравится так как понимаю его уже, первый я не очень понял. Для чего ":" и "?"
Как записать это в развернутом варианте?
так
var age = 100;
					document.write(
					(age<19)?'За границей говорят что я стар'
					:(age<31)?'Да'
					:(age<51)?'Я стар'
					:(age<81)?'Я очень стар'
					:'Я superstar');

или так
var age = 100;
					document.write(
					(age<19)?'За границей говорят что я стар':
					(age<31)?'Да':
					(age<51)?'Я стар':
					(age<81)?'Я очень стар':
					'Я superstar');

lord2kim 02.12.2013 22:11

Antarius, "(выражение) ? (действие, если true) : (действие, если false)" - тернарный оператор, аналог if...else

Antarius 02.12.2013 22:18

Загрузил)))
Смотри, у меня тут парочка вопросов сразу появилась)

Это массив?
var stages = {
    "За границей говорят что я стар": [-Infinity, 18],
    "Да": [18, 30],
    "Я стар": [30, 50],
    "Я очень стар": [50, 80],
    "Я superstar": [80, Infinity]
};


Мы такое не проходили еще :D

var message = "No age";
for (var key in stages)
    if (age > stages[key][0] && age <= stages[key][1]) {
        message = key;
        break;
    }
//document.write(message);
alert(message);

"For" это цикл, а "var key in stages" это даже не могу найти в гугле, но по логике это "этапные ключи" (первый раз слышу про var key in stages), я так полагаю что в учебнике есть эта инфа)
Спасибо, движемся дальше :)

Antarius 02.12.2013 22:59

Цитата:

Сообщение от lord2kim (Сообщение 284131)
Antarius, "(выражение) ? (действие, если true) : (действие, если false)" - тернарный оператор, аналог if...else

Попробовал, понравилось, спасибо :))
(age < 81 ) ? document.write("Я очень стар") : document.write("Я суперстар");
//если переменная "age" меньше 81 то выходит сообщение "я очень стар", в противном случае "я суперстар"

Сейчас попробую сделать побольше вариантов.

danik.js 02.12.2013 23:10

Цитата:

Сообщение от Antarius
Это массив?

Это объект. Просто объявлен сразу со всеми ключами в литеральной форме.
Можно было так:
var stages = new Object();
stages.Да = [18, 30]; // тоже что и stages["Да"]
stages["Я стар"] = [30, 50]; // тут пробел в ключе, так что вариант с точкой не канает
// и т.д...


Также ты мог слышать про JSON. Собсно вот это:
{
    "За границей говорят что я стар": [-Infinity, 18],
    "Да": [18, 30],
    "Я стар": [30, 50],
    "Я очень стар": [50, 80],
    "Я superstar": [80, Infinity]
};

и есть объект, описанный в JSON-нотации (токо Infinity в JSON не проканает, надо поубирать).


Цитата:

Сообщение от Antarius
"var key in stages" это даже не могу найти в гугле, но по логике это "этапные ключи"

Отдуши посмеялся :)) Этапные ключи )))

Это же for..in цикл. Проходит по всем (почти) ключам объекта. stages - это же наш объект, который мы объявили выше. А var key - это мы объявили переменную, в которой и будут итерироваться ключи (как var i в обычном цикле).
Прочитать можно как «для каждого свойства в объекте "stages" выполнить: пусть key будет именем текущего свойства...»

Antonius 02.12.2013 23:24

Короче его делать просто не нужно. Для такой задачи — адекватный, хорошо читаемый код. Пусть его длина вас не смущает. Попытки сократить приведут к тому, что читаться будет хуже.

danik.js 02.12.2013 23:29

Antonius, верно. Еще бы хорошо вместо document.write просто менять значение переменной и делать document.write вконце.

Antarius 03.12.2013 00:19

2 danik.js
Почти всё понял, уверен спустя месяц перечитаю всё и пойму еще лучше)) Спасибо большое что отвечаешь)
Цитата:

Сообщение от danik.js
Отдуши посмеялся ) Этапные ключи )))

Та да, холодно на улице, сморозил :D

2 Antonius
Ничего себе, похожие ники, похожие :)
Ну мне было просто интересно, как можно сократить код, ведь как по мне, чем короче код тем быстрее он работает, я прав да?)

Цитата:

Сообщение от danik.js
Еще бы хорошо вместо document.write просто менять значение переменной и делать document.write вконце.

Этом...а можно пример?) Только очень простой пожалуйста)

lord2kim 03.12.2013 00:23

Цитата:

Сообщение от Antarius (Сообщение 284139)
(age < 81 ) ? document.write("Я очень стар") : document.write("Я суперстар");

Цитата:

Сообщение от Antarius (Сообщение 284163)
Этом...а можно пример?) Только очень простой пожалуйста)

document.write(age < 81 ? "Я очень стар" : "Я суперстар");
//или
var str = age < 81 ? "Я очень стар" : "Я суперстар";
document.write(str);

danik.js 03.12.2013 00:44

Цитата:

Сообщение от Antarius
чем короче код тем быстрее он работает, я прав да?)

Нет. В данном случае тернарные операторы работают медленней, чем обычные if/else, а мой вариант с объектом еще медленней (причем намного).
Но ведь глупо говорить о "скорости" в конексте твоего примера, который при любой из трех реализаций отработает менее чем за миллисекунду.
Поэтому нужно выбирать наиболее читаемый и поддерживаемый способ, а не быстрый.

Antarius 03.12.2013 11:10

Цитата:

Сообщение от danik.js
Поэтому нужно выбирать наиболее читаемый и поддерживаемый способ, а не быстрый.

Я тебя понял, спасибо.

Antarius 03.12.2013 16:22

Дорогие товарищи, работая в notepad++ и постоянно перескакивая в браузер, который зависает сразу если неправильно написал цикл, возник новый вопрос.
Какой IDE посоветуете для работы с JS?
Написал код, тут же его проверил.
Написал бесконечный цикл, тут тебе выскочила ошибка "сынок, у тебя бесконечный цикл, проснись" :D
Что вы можете сказать про JetBrains Webstorm?

ksa 03.12.2013 16:34

Цитата:

Сообщение от Antarius
Написал бесконечный цикл, тут тебе выскочила ошибка "сынок, у тебя бесконечный цикл, проснись"

Не настолько все интуитивно... :)

Antarius 03.12.2013 16:41

Цитата:

Сообщение от ksa
Не настолько все интуитивно...

А лично ты чем пользуешься?)

animhotep 03.12.2013 16:42

Цитата:

Сообщение от Antarius
Какой IDE посоветуете для работы с JS?

выглядит интересно, жаль линукс не поддержиают(
http://habrahabr.ru/company/codeorchestra/blog/204538/

Antarius 03.12.2013 16:51

Цитата:

Сообщение от animhotep
выглядит интересно, жаль линукс не поддержиают(
http://habrahabr.ru/company/codeorchestra/blog/204538/

Посмотрел) Sublime Text интересный))) но сволочь платный)))

animhotep 03.12.2013 16:53

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

Antarius 03.12.2013 16:58

Цитата:

Сообщение от animhotep
бесплатная версия только окошко выкидывает периодически
шторм тоже платный кстати

Ясно. Спасибо. Я тут натолкнулся на Aptana Studio 3. Он и на PC, Linux, Mac работает и бесплатный :) Попробую сейчас его, но я так понял что неважно где писать код, хоть в блокноте, главное что бы он работал. Но ведь удобство тоже играет огромную роль) Вот какой самый удобный, самый user friendly? Вообще есть такие?))

ksa 03.12.2013 20:26

Цитата:

Сообщение от Antarius
А лично ты чем пользуешься?

Нотепад++ :D

Antarius 03.12.2013 23:43

Товарищи, я остановился на Sublime Text. Очень удобный интерфейс, со сниппетами до конца еще не разобрался но программка в целом очень нравится :) Сейчас у меня была задача сделать таблицу умножения.
В примечании написано:
Использовать цикл в цикле.
for (var i = 1; i < 10; i++) {
  for (var j = 1; j < 10; j++) {
    var result = i * j;
  }
}

Вот само решение, конечно, без помощи гугла я бы не сдвинулся дальше, но сейчас я хорошо понимаю что тут написано.
<table border="1">
			<script type="text/javascript">

				for (var i = 1; i < 10; i++) {
					document.write("<tr>");
  					for (var j = 1; j < 10; j++) {
    					var result = i * j;
    					document.write("<td>"+result+"</td>");
  					}	
  					document.write("</tr>");
				}
			</script>
	</table>

Возникли проблемы решения такой же задачи с Do While, через пол часа отпишусь если не смогу сам решить :D да в любом случае я сюда всё выкладываю, ОпенСорс фор зе вин! :lol:

Antarius 03.12.2013 23:47

Цитата:

Сообщение от ksa
Нотепад++

Там нет сниппетов :lol: я же нуб, без них проблемотично :lol:

Antarius 04.12.2013 01:34

Граждане! Сейчас изучаю While и For. Это два цикла.
For я больше понимаю чем While. Но вот тут главный вопрос: Есть ли какая либо задача без которой нельзя обойтись без While?

ksa 04.12.2013 08:44

Цитата:

Сообщение от Antarius
Там нет сниппетов

Цитата:

Ведь для хорошего для рыбака
Удочка только нужна и река
http://spinning.fish-fisher.ru/p/blog-page_25.html

Antarius 05.12.2013 18:19

Товарищи офицеры, у меня возник маленький баг и я не в курсе как его решить. Вроде всё понятно, но цикл работает не правильно.
Да и в конце выводит не 5, а 6...я не знаю где я напортачил..
Нужно чтобы выскакивало сообщение до тех пор пока юзер не напишет число больше 5. :help:
for (var i = 0; i <= 5; i++) {
		i = Number(prompt("Введите любое число больше 5"));
		if (i <= 5){
			alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
		}
		else{
			alert("Спасибо, вы ввели "+i);
			break;
		}
	}

	document.write("Число "+i);

ksa 05.12.2013 18:26

Цитата:

Сообщение от Antarius
цикл работает не правильно

Он работает правильно.

Цитата:

Сообщение от Antarius
конце выводит не 5, а 6

Потому как цикл закончился при этом значении переменной i.

Цитата:

Сообщение от Antarius
Нужно чтобы выскакивало сообщение до тех пор пока юзер не напишет число больше 5

Как вариант...

<!DOCTYPE html>
<html>
<head>
<!--
<script src="http://code.jquery.com/jquery-latest.js"></script>
<link rel="stylesheet" type="text/css" href="tmp.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
-->
<style type="text/css">
</style>
<script type="text/javascript">
while (true) {
	var i = Number(prompt("Введите любое число больше 5"));
	if (i <= 5){
		alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
	} else {
		alert("Спасибо, вы ввели "+i);
		break;
	};
}
document.write("Число "+i);
</script>
</head>
<body>
</body>
</html>

danik.js 05.12.2013 20:39

Другой вариант (насколько я знаю за while(true) в некоторых местах могут наругать, правда за присвоение в условии тоже наругают :) )
var promptNumber = function() {
    return Number(prompt("Введите любое число больше 5"));
}

var i; 
while ( (i = promptNumber()) <= 5) {
    alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
}

alert("Спасибо, вы ввели "+i);
//document.write("Число "+i);

ksa 05.12.2013 21:36

Цитата:

Сообщение от danik.js
насколько я знаю за while(true) в некоторых местах могут наругать

Тогда модифицируем немного...

do {
	var i = Number(prompt("Введите любое число больше 5"));
	if (i <= 5){
		alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
	} else {
		alert("Спасибо, вы ввели "+i);
	};
} while (i<=5);
alert("Число "+i);
//document.write("Число "+i);

Vlasenko Fedor 06.12.2013 03:01

Вариант учитывает ввод ошибочных данных к примеру букв
for (var getNumber = function () {
      return prompt("Введите любое число больше 5")
  }, i; i = getNumber(), 5 >= i || isNaN(i);) 
  //закончили объявление переменных и условие цикла, ниже строчка одна - тело цикла как видите можно без {}
    alert("Вы ввели " + (isNaN(i) ? 'не число': i) + ". Пожалуйста введите число больше 5");
    alert("Спасибо, вы ввели " + i);

Цитата:

Сообщение от danik.js (Сообщение 284821)
правда за присвоение в условии тоже наругают

где ругают?
стандартный цикл это объявление переменных var a, b, c...;
выполнение действий можно в цепочку, последнее условие a++, b -=1, !с;
выполнение действий после выполнения прохода тела цикла --g, d=0, z--
for (var i = 3, b = 0; alert('i - ' + i--), i; alert('b - ' + b++))console.log(i, b);

Antonius 06.12.2013 04:12

Вот за такое и ругают :)

Если можно — не значит, что нужно. А тут человек явно написал, что только учится. Не учите плохому сразу — сам научится.

ksa 06.12.2013 08:36

Цитата:

Сообщение от Poznakomlus
Это должно расширять кругозор

Т.е. учиться на чужих ошибках... :D

В нашем случае на не совсем "правильном" оформлении кода.

Vlasenko Fedor 06.12.2013 12:58

Цитата:

Сообщение от ksa (Сообщение 284868)
Т.е. учиться на чужих ошибках... :D
В нашем случае на не совсем "правильном" оформлении кода.

Это вы о чем простите?
Стандарты? Удобство читаемости? Стиль написания?
Какие ошибки.
Ошибки в ваших примерах логические
Возьмите код
for(var i = 0; i < 5; i += 1){alert(i)}

Закиньте его в компилятор от Google http://closure-compiler.appspot.com/home

Antarius 06.12.2013 13:01

И тут я познакомился с функциями :) переварив код, вопросов не появилось :)))

Цитата:

Сообщение от danik.js (Сообщение 284821)
Другой вариант (насколько я знаю за while(true) в некоторых местах могут наругать, правда за присвоение в условии тоже наругают :) )
var promptNumber = function() {
    return Number(prompt("Введите любое число больше 5"));
}

var i; 
while ( (i = promptNumber()) <= 5) {
    alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
}

alert("Спасибо, вы ввели "+i);
//document.write("Число "+i);



ksa а как сделать тоже самое с циклом for ? Ведь мой вариант выводит не всё так четко как в твоем случае.
Просто for мне больше нравится :D
Цитата:

Сообщение от ksa (Сообщение 284829)
Тогда модифицируем немного...

do {
	var i = Number(prompt("Введите любое число больше 5"));
	if (i <= 5){
		alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
	} else {
		alert("Спасибо, вы ввели "+i);
	};
} while (i<=5);
alert("Число "+i);
//document.write("Число "+i);


Спасибо!! Интересно)
Цитата:

Сообщение от Poznakomlus (Сообщение 284863)
Вариант учитывает ввод ошибочных данных к примеру букв
for (var getNumber = function () {
      return prompt("Введите любое число больше 5")
  }, i; i = getNumber(), 5 >= i || isNaN(i);) 
  //закончили объявление переменных и условие цикла, ниже строчка одна - тело цикла как видите можно без {}
    alert("Вы ввели " + (isNaN(i) ? 'не число': i) + ". Пожалуйста введите число больше 5");
    alert("Спасибо, вы ввели " + i);


где ругают?
стандартный цикл это объявление переменных var a, b, c...;
выполнение действий можно в цепочку, последнее условие a++, b -=1, !с;
выполнение действий после выполнения прохода тела цикла --g, d=0, z--
for (var i = 3, b = 0; alert('i - ' + i--), i; alert('b - ' + b++))console.log(i, b);


Плохого не пожелают :lol:
Цитата:

Сообщение от Antonius (Сообщение 284864)
Вот за такое и ругают :)

Если можно — не значит, что нужно. А тут человек явно написал, что только учится. Не учите плохому сразу — сам научится.


ksa 06.12.2013 13:10

Цитата:

Сообщение от Antarius
а как сделать тоже самое с циклом for ?

Как вариант...

for (;true;) {
	var i = Number(prompt("Введите любое число больше 5"));
	if (i <= 5){
		alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
	} else {
		alert("Спасибо, вы ввели "+i);
		break;
	};
};
alert("Число "+i);
//document.write("Число "+i);

Но это уже полный изврат... :D

Цитата:

Сообщение от Antarius
Просто for мне больше нравится

Да ты эстет! :D

danik.js 06.12.2013 14:46

Вот как я представляю алгоритм реализации:

введенное_число = спросить_число()
пока (введенное_число <= 5) {
рапортуем("не канает!")
введенное_число = спросить_число()
}


соответственно мой немного измененный вариант:

var promptNumber = function() {
    return Number(prompt("Введите любое число больше 5"));
}
 
var i = promptNumber();
while (i <= 5) {
    alert("Вы ввели "+i+" , Пожалуйста введите число больше 5");
    i = promptNumber();
}
 
alert("Спасибо, вы ввели "+i);
//document.write("Число "+i);



Помоему это самый простой, легко читаемый, очевидный и сам собой напрашивающийся вариант.

В первом варианте я просто укоротил запись, и впринципе код так же укладывается в алгоритм.

Найду странным если другие сомной не согласятся :)

ksa 06.12.2013 14:51

danik.js, цикл с постусловием тут больше подходит... ;)
http://javascript.ru/forum/misc/4335...tml#post284829

danik.js 06.12.2013 15:42

ksa, у тебя дублируется проверка условия. Это не хорошо.


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