Меню
✘Скрыть меню
Меню заработка
✘Скрыть меню
Загрузка.. nostroma.online from NOSTROMA - best life and beautiful workЭто ужасно тяжелая работа — ничего не делать – Оскар УайльдРешающую роль в работе играет не всегда материал, но всегда мастер – Максим ГорькийЯ слишком энергичен, чтобы работать – Марсель АшарЧто привлекло меня в карьере писателя? Отсутствие бумажной работы.Одни люди работают только для того чтобы работать, другие – для того, чтобы иметь возможность не работать в будущем.Занятие ерундой на рабочем месте развивает боковое зрение, слух и бдительность в целомСтоит статýя в лучах заката с огромным буем, в руках - граната.Друзья, если вы попались на лохотрон, не будьте эгоистами - предупредите других о таком сайте!Секрет гения — это работа, настойчивость и здравый смысл. Томас Эдисон
Меню заработка

Курсы JavaScript

Урок 4. Синтаксис основных операторов


Синтаксис основных операторов

Вы уже, наверное, заметили, что при вызове console.log() в консоли браузера, эта функция сначала возвращает переданное значение, а затем значение undefined. Это объясняется особенностями встроенной функции console.log():

	console.log('Hello World!');
	// Hello World!
	// undefined
	

Такое поведение console.log() можно изменить, переопределив её:

	var oldLog = console.log;
	
	console.log = function(x){
		oldLog(x);
		return "";
	}
	
	console.log('Hello World!');
	// Hello World!
	// ""
	

Теперь функция console.log() возвращает переданное ей значение 'x' и пустую строку "".

Логический оператор "или"

Рассмотрим функцию, которая вычисляет площадь треугольника по формуле Герона S = √(p⋅(p - a)⋅(p - b)⋅(p - c)), где p - полупериметр треугольника, a, b, c - стороны треугольника:

	function geron(a,b,c){
		a = a || 3; b = b || 4; c = c || 5;
		
		var p = (a + b + c) / 2;
		
		return Math.sqrt(p * (p - a) * (p - b) * (p - c));
	}
	
	console.log( geron() );
	
	// Выведет: 6
	

Логический оператор ИЛИ задаётся двойным символом вертикальной черты ||. В классическом программировании этот оператор работает так: "если хотя бы один из аргументов true, то возвращает true, иначе false".

Если один или оба аргумента не логического типа, то они к нему приводятся в целях вычислений. В первом уроке JavaScript мы говорили о тех самых 6-ти случаях, когда значения рассматриваются как false.

В приведённом выше примере для случая, когда аргументы a,b,c сводятся к false, заданы значения по умолчанию - это 3,4,5.

Однако значение "ноль" также будет сведено к логическому false и мы получим не тот ответ, который хотелось бы. Для устранения этого недочёта потребуются дополнительные проверки в написанной в примере функции. Также значения типа "gg", "ffaa" и т.п. не будут сведены к false и опять-таки нужны дополнительные проверки и на этот случай. Об этом далее.

Инструкции

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

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

"По умолчанию" программа на JavaScript - это просто последовательность смен состояния, т.е. выполнение инструкций в том порядке, в котором они фигурируют в тексте. Управление этим порядком осуществляется с помощью управляющих конструкций:

Условные инструкции (if, switch);
Инструкции циклов (while, for);
Инструкции переходов (return, throw, break)

Условные инструкции

Рассмотрим наиболее популярную идиому условного оператора if:

	if (!myVar){
		// сделать что-то
	}
	

Восклицательный знак ! - это логический оператор отрицания. Код в приведённом выше примере выполнится, если переменная "myVar" равна null, undefined, нулю, пустой строке, NaN (т.е. если значение переменной будет сведено к логическому false) и не выполнится во всех остальных случаях.

Двойной амперсанд && - это логический оператор конъюнкции (логическое "И"), двойная вертикальная черта || - это логический оператор дизъюнкции (логическое "ИЛИ").

Отрицание дизъюнкции по закону де Моргана - это:
!(A || B) = !A && !B

Ветвление

Рассмотрим всем знакомую схему из школьных уроков информатики:



... и напишем для неё код JavaScript:
	var a = 0;
	var b = 100;
	var res = Math.floor(a + Math.random() * (b - a + 1));
	
	// Первый вариант
	
	if (res == 50) {
		console.log('center');
	} else if (res > 50) {
		console.log('right');
	} else {
		console.log('left');
	}
	
	// Второй вариант
	
	if (res == 50) {
		console.log('center');
	} else{
		if (res > 50){
			console.log('right');
		} else {
			console.log('left');
		}
	}
	

Метод Math.floor() возвращает наибольшее целое число, которое меньше или равно данному числу;

Math.random() генерирует случайное число от 0 до 1, в указанной в примере формуле Math.random() возвращает случайное число в промежутке от "a" до "b" (т.е. в примере мы получаем случайное число от 0 до 100).

Блок else будет выполняться, если условие в if окажется неверным. Простейший пример для понимания работы условий if...else можно представить так:

	var x = 5;
	
	if (x == 5){
		console.log('x равен 5');
	} else {
		console.log('x не равен 5');
	}
	
	// Условие в if верно, блок else не будет выполнен; выведет в консоль "x равен 5"
	
	var x = 7;
	
	if (x == 5){
		console.log('x равен 5');
	} else {
		console.log('x не равен 5');
	}
	
	// Условие в if неверно, будет выполнен блок else; выведет в консоль "x не равен 5"
	

Функция isNaN()

isNaN() - встроенная функция JavaScript, которая пытается преобразовать переданный ей аргумент в число. Если такое преобразование возможно (например строка "5"), то возвращает false, иначе - true.

	var x = 5; // число 5
	var y = "5"; // строка "5"
	var z = true; // булевское true
	var q = 'Hello!'; // строка 'Hello!'
	
	isNaN(x); // false - аргумент является числом
	isNaN(y); // false - аргумент может быть преобразован в число (5)
	isNaN(z); // false - аргумент может быть преобразован в число (1)
	isNaN(q); // true - аргумент не может быть преобразован в число
	

Значение x == NaN и x === NaN всегда false для любого значения x, даже если x = NaN!

Таким образом, для приведённой выше формулы Герона можно задать дополнительную проверку на возможность преобразования переданных аргументов в числа:

	function geron(a,b,c){
		
		if (isNaN(a) || !a) {a = 3;}
		if (isNaN(b) || !b) {b = 4;}
		if (isNaN(c) || !c) {c = 5;}
		
		var p = (a + b + c) / 2;
		
		return Math.sqrt(p * (p - a) * (p - b) * (p - c));
	}
	
	console.log( geron() );
	
	// Выведет: 6
	

В примере выше функция isNaN() даст true в случаях когда аргумент "a" фактически есть NaN и когда a === undefined, т.е. это случаи типа "qq" и случаи не переданности аргумента, но пропускает случай пустой строки (""). Вторая часть дизъюнкции обрабатывает случай пустой строки, но пропускает случаи типа "qq" (непустая строка). Вместе они обрабатывают всё, что нам нужно, за исключение числа ноль, что может оказаться некстати.

Укороченные схемы вычисления (Short circuit)

1. a || b - здесь b вычисляется, только если a приводится к false (те самые 6 случаев)

2. a || func(...) - синоним if (!a) { func(); }

3. a && b - здесь b вычисляется, только если a приводится к true

4. a && func(...) - синоним if (a) { func(); }

Кейсы - оператор switch

Случай (кейсы) - это возможные варианты вычисления выражения после switch. Кейсы проверяются на идентичность (тройное равно) значению выражения в параметре switch (переданный аргумент, указанный в скобках). Для начала рассмотрим простой пример:

	var a = 0;
	var b = 100;
	var result = Math.floor(a + Math.random() * (b - a + 1));
	// в переменной result хранится случайное число от 0 до 100
		
	switch (result){
		
		case 50:
			console.log('center');
			break;
			
		case 51:
			console.log('right');
			break;
			
		case 49:
			console.log('left');
			break;
			
		default:
			console.log('unknown');
			break;
	}
	

Каждый case оператора switch срабатывает только на одно определённое значение переменной result. Оператор break прерывает дальнейшее выполнение switch, если сработал один из кейсов (случаев). Случай default срабатывает, если не один из кейсов не отработал, например для result = 2.

Если в кейсе нет оператора break, то после обработки этого кейса выполнение switch продолжится.

А можно ли обрабатывать при помощи switch не одно конкретное значение, а диапазон значений? Да, можно, однако это нетипичный случай для оператора switch, обычно для этого используется if или if...else, но примерчик посмотрим:

	var a = 0;
	var b = 100;
	var result = Math.floor(a + Math.random() * (b - a + 1));
	// в переменной result хранится случайное число от 0 до 100
		
	switch (result < 50){
		
		case true:
			console.log(result);
			console.log('right');
			break;
			
		case false:
			console.log(result);
			console.log('center or left');
			console.log( result == 50?'center':'left' );
			break;
	}
	

Тернарный оператор в console.log( result == 50?'center':'left' ) работает так: если переменная result равна 50, в консоль выводится то, что находится после знака "вопрос" перед двоеточием (center), иначе - после двоеточия (left).

Тернарный - оперирующий тремя операндами:

Комментарии

Введите Ваше имя:*

Введите e-mail:

Ваш комментарий:*

* Обязательные поля