JavaScript: Переменные и конкатенация
Для закрепления предыдущей темы, попробуем использовать переменные с конкатенацией. Синтаксически ничего не меняется: мы умеем конкатенировать (склеивать) две строки:
let what = 'Kings' + 'road'; console.log(what); // => Kingsroad
… а значит сумеем конкатенировать строку и одну переменную, в которой записана строка:
let first = 'Kings'; let what = first + 'road'; console.log(what); // => Kingsroad
… и даже конкатенировать две переменные, в которых записаны строки:
let first = 'Kings'; let last = 'road'; let what = first + last; console.log(what); // => Kingsroad
Задание
Сайты постоянно посылают письма своим пользователям. Типичная задача — сделать автоматическую отправку персонального письма, где в заголовке будет имя пользователя. Если где-то в базе сайта хранится имя человека в виде строки, то задача генерации заголовка сводится к конкатенации: например, нужно склеить строку Здравствуйте со строкой, где записано имя.
Напишите программу, которая будет генерировать заголовок и тело письма, используя уже готовые переменные, и выводить получившиеся строки на экран.
Для заголовка используйте переменные firstName и greeting , запятую и восклицательный знак. Выведите это на экран в правильном порядке.
Для тела письма используйте переменные info и intro , при этом второе предложение должно быть на новой строке.
Результат на экране будет выглядеть так:
Hello, Joffrey! Here is important information about your account security. We couldn't verify your mother's maiden name.
Выполните задание, используя только два console.log() .
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
- Подумайте, с какой строкой и в каком порядке нужно склеивать переменные, чтобы получить такой двухстрочный вывод тела письма.
- Помните, что можно создать строку, которая содержит только управляющую последовательность \n .
Определения
- Конкатенация — операция соединения двух строк. Например, console.log(«King’s » + ‘ Landing’);
Bablosoft
Как сложить две переменные, чтобы получилось число, а не строка?
Запланировано Прикреплена Закрыта Перенесена Поддержка
3 Сообщения 2 Posters 640 Просмотры
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
написал в отредактировано
Привествую
Нужно сложить 2 переменные:
Var1 = 2
Var2 = 5
Var3 = [[Var1]]+[[Var2]] Результат получаю в виде сложения двух строк. Т.е. 2+5=25, а не 7. Подскажите, как с этим бороться.
Order script / Заказать скрипт > tg
написал в отредактировано GameBot
@Nazar said in Как сложить две переменные, чтобы получилось число, а не строка?:
Var3 = [[Var1]]+[[Var2]]
Видимо у вас в переменных строки, а не числа.
Var3 = Number([[Var1]])+Number([[Var2]]) тип expression
ответил GameBot в отредактировано
@GameBot
Спасибо, наконец-то разобрался с этим.
Order script / Заказать скрипт > tg
Кубик «Загрузить» а урл *.pdf не понимаю кое что.
Запланировано Прикреплена Закрыта Перенесена Поддержка
6 Сообщения
73 Просмотры
@000 а вы не путаете с ctrl Alt Del нет?
Как в БД записывать число ?
Запланировано Прикреплена Закрыта Перенесена Поддержка
3 Сообщения
109 Просмотры
expression хорошо записывает числа как напрямую так и из переменных которые являются числами. Перед этим хорошо бы столбику где будут числа назначить тип данных INT.
П.с. в инспекторе переменных числа в типе данных INT отображаются фиалетовым а числа в типе данных string зелёным. Обратите внимание чтобы соответствовал тип данных
Как вызвать не функцию а определенное действие зная его id?
Запланировано Прикреплена Закрыта Перенесена Поддержка
17 Сообщения
224 Просмотры
@denanotherday нужно вернуться к тому же действию на котором она возникла ,потому что после возникновения ошибки скрипт запускается заново или пропускает этот шаг или начинает выполнять какую то функцию сначала, но мне это не нужно , нужно именно вернуться к тому действию даже если ошибка возникла в середине скрипта, чтоб он не начинал все сначала или пропускал этот шаг, но так как ошибка может возникнуть на другом действии , метки , вызов функции и тп блоки мне не помогут
Ошибка это по определению исключение из нормы. Не хочешь править скрипт, тогда проверяй наличие ее и возвращай скрипт куда нужно.
14. Арифметические операции в JavaScript
Вы знакомы с арифметикой? Умеете складывать и вычитать числа? JavaScript тоже умеет складывать и вычитать. В JavaScript есть такие операторы: сложение +, вычитание -, деление /, умножение *, деление с возвратом остатка %.
var one = 121;
var two = 13;
alert(one + two);
alert(one - two);
alert(one * two);
alert(one / two);
alert(one % two);
Усложним пример 1
var answer = ((121 - 12) * 103) + 200;
alert(answer);
Усложним пример 2
var PI = 3.14;
var answer = ((121 - 12) * 103) + PI;
alert(answer);
И третий пример усложним
var PI = 3.14;
var answer = ((121 - 12) * 103) + PI;
var answerEnd = (2 * answer * PI) + (-100);
alert(answerEnd);
И даже так можно сделать
var answer = 101 + (-(-100));
alert(answer);
Но это ерунда, по сравнению с тем, что еще умеет JavaScript. Для этого есть стандартный объект Math с множеством свойств (свойства и есть операции, в данном контексте).
Math.pow(2, 53) /* -> 2 в степени 53 */
Math.round(0.6) /* -> 1.0 - округление до ближайшего целого */
Math.ceil(0.6) /* -> 1.0 - округление вверх */
Math.floor(0.6) /* -> 0.0 - округление вниз */
Math.abs(-5) /* -> 5 - модуль, абсолютное значение */
Math.max(x, y, z) /* -> Возвращает наибольший аргумент */
Math.min(x, y, z) /* -> Возвращает наименьший аргумент */
Math.random(); /* -> Где число на выходи больше 0, но меньше 1 */
Math.PI /* -> Число Пи */
Math.E /* -> Основание натурального логарифма */
Math.sqrt(3) /* -> Корень квадратный из 3 */
Math.pow(3, 1/3) /* -> Корень кубический из 3 */
Math.sin(0) /* -> Тригонометрия: имеются так же Math.cos, Math.atan и другие */
Math.log(10) /* -> Натуральный логарифм 10 */
Math.log(100) / Math.LN10 /* -> Логарифм 100 по основанию 10 */
Math.log(512) / Math.LN2 /* -> Логарифм 512 по основанию 2 */
Math.exp(3) /* -> Math.E в кубе */
Как использовать объект Math?
/* Первый пример */
var twoInPow = Math.pow(2, 53);
alert(twoInPow);
/* Второй пример */
var valueRaund = 0.1312;
var answerRaunt = Math.round(valueRaund);
alert(answerRaunt);
/* Третий пример */
var valueRaund = 0.1312;
alert(Math.round(valueRaund));
/* Четвертый пример: поиск наибольшего из трех чисел */
var a = 12, b = 11, c = 10;
alert(Math.max(a, b, c));
В случае выхода из диапазона, потери значащих разрядов или деления на ноль, JavaScript не выдает ошибку. Если результат будет слишком большой и выйдет из диапазона, то будет возвращено специальное значение «бесконечность», выглядит оно так « Infinity ».
Потеря значащих разрядов: результат арифметической операции оказывается очень близким к нулю. Если все же потеря была, то будет возвращен 0 (ноль).
Глобальная переменная NaN означает «не число». Есть одна особенность у этой переменной, операция проверки на равенство (==) всегда возвращает отрицательный результат и даже если его сравнивать с самим собой.
/* Так писать нельзя */
if (x == NaN)
Чтобы определить, является ли значение переменной x значением NaN, нужно использовать конструкцию, которая ниже. Эта проверка будет иметь значение true только тогда, когда x будет равен NaN
/* Так можно */
if (x != x)
Дополнение: оформление кода
Допустим вам нужно вывести два числа 12 и 16 . Вероятно вы сделаете так:
var one = 12, two = 16;
document.write(one);
document.write(two);
А в ответ получите 1216 , то есть пробела между ними не будет. Встает вопрос: Как добавить пробел?
/* Первый способ решения */
var one = 12, two = 16;
document.write(one + " ");
document.write(two);
/* Второй, более компактный */
var one = 12, two = 16;
document.write(one + " " + two);
Как видите, нужно просто склеить переменную с пробелом (пробел между кавычек). Склеить строки, значит поставить между ними знак плюс (+)
document.write("Строка 1" + "Строка 2");
document.write("Строка 1" + " " + "Строка 2");
Операторы
Операторов язык JavaScript поддерживает очень много — на все случаи жизни. Их можно разделить на несколько групп.
Арифметические операторы
Арифметические операторы служат для выполнения арифметических действий над числами. Все арифметические операторы, поддерживаемые JavaScript, перечислены в табл. 14.2.
Арифметические операторы делятся на две группы: унарные и бинарные. Унарные операторы выполняются над одним операндом; к ним относятся операторы смены знака, инкремента и декремента. Унарный оператор извлекает из переменной значение, изменяет его и снова помещает в ту же переменную. Приведем пример выражения с унарным оператором:
При выполнении этого выражения в переменной r окажется ее значение, увеличенное на единицу. А если записать вот так:
то значение r, увеличенное на единицу, будет помещено еще и в переменную s.
Операторы инкремента и декремента можно ставить как перед операндом, так и после него. Если оператор инкремента стоит перед операндом, то значение операнда сначала увеличивается на единицу, а уже потом используется в дальнейших вычислениях. Если же оператор инкремента стоит после операнда, то его значение сначала вычисляется, а уже потом увеличивается на единицу. Точно так же ведет себя оператор декремента.
Бинарные операторы всегда имеют два операнда и помещают результат в третью переменную. Вот примеры выражений с бинарными операторами:
l = r * 3.14;
f = e / 2;
x = x + t / 3;
Оператор объединения строк
Оператор объединения строк + позволяет соединить две строки в одну. Например, сценарий:
s1 = «Java»;
s2 = «Script»;
s = s1 + s2;
поместит в переменную s строку JavaScript.
Операторы присваивания
Оператор присваивания = нам уже знаком. Его еще называют оператором простого присваивания, поскольку он просто присваивает переменной новое значение:
Второе выражение в приведенном примере выполняет присвоение значения 3 сразу двум переменным — b и c.
JavaScript также поддерживает операторы сложного присваивания, позволяющие выполнять присваивание одновременно с другой операцией:
Два этих выражения эквивалентны по результату. Просто во втором указан оператор сложного присваивания +=.
Все операторы сложного присваивания, поддерживаемые JavaScript, и их эквиваленты приведены в табл. 14.3.

Операторы сравнения
Операторы сравнения сравнивают два операнда согласно определенному условию и выдают (или, как говорят программисты, возвращают) логическое значение. Если условие сравнения выполняется, возвращается значение true, если не выполняется — false.
Все поддерживаемые JavaScript операторы сравнения приведены в табл. 14.4.
Переменная a1 получит значение true (2 меньше 3), переменная a2 — значение false (число –4 по определению не может быть больше нуля), а значение переменной a3 будет зависеть от значений переменных r и t.

Можно сравнивать не только числа, но и строки:
a = «JavaScript» != «Java»;
Переменная a получит значение true, т. к. строки «JavaScript» и «Java» не равны.
На двух последних операторах из табл. 14.4 — «строго равно» и «строго не равно» — нужно остановиться подробнее. Это операторы так называемого строгого сравнения. Обычные операторы «равно» и «не равно», если встречают операнды разных типов, пытаются преобразовать их к одному типу (о преобразованиях типов см. далее в этой главе). Операторы строгого равенства и строгого неравенства такого преобразования не делают, а в случае несовпадения типов операндов всегда возвращают false.
Переменная a1 получит значение true, т. к. в процессе вычисления строка «2» будет преобразована в число 2, и условие сравнение выполнится. Но переменная a2 получит значение false, т. к. сравниваемые операнды принадлежат разным типам.
Логические операторы
Логические операторы выполняют действия над логическими значениями. Все они приведены в табл. 14.5. А в табл. 14.6 и 14.7 показаны результаты выполнения этих операторов.
Основная область применения логических операторов — выражения сравнения (о них см. далее в этой главе). Приведем примеры таких выражений:

Оператор получения типа typeof
Оператор получения типа typeof возвращает строку, описывающую тип данных операнда. Операнд, тип которого нужно узнать, помещают после этого оператора и заключают в круглые скобки:
В результате выполнения этого выражения в переменной s окажется строка «string», обозначающая строковый тип.
Все значения, которые может вернуть оператор typeof, перечислены в табл. 14.8.

Совместимость и преобразование типов данных
Настала пора рассмотреть еще два важных вопроса: совместимость типов данных и преобразование одного типа к другому.
Что получится, если сложить два числовых значения? Правильно — еще одно числовое значение. А если сложить число и строку? Трудно сказать. Тут JavaScript сталкивается с проблемой несовместимости типов данных и пытается сделать эти типы совместимыми, преобразуя один из них к другому. Сначала он пытается преобразовать строку в число и, если это удается, выполняет сложение. В случае неудачи число будет преобразовано в строку, и две полученные строки будут объединены. Например, в результате выполнения Web-сценария из листинга 14.6 значение переменной b при сложении с переменной a будет преобразовано в числовой тип; таким образом, переменная c будет содержать значение 23.

Но поскольку значение переменной d нельзя преобразовать в число, значение e будет преобразовано в строку, и результат — значение f — станет равным «JavaScript2».
Логические величины преобразуются либо в числовые, либо в строковые, в зависимости от конкретного случая. Значение true будет преобразовано в число 1 или строку «1», а значение false — в 0 или «0». И наоборот, число 1 будет преобразовано в значение true, а число 0 — в значение false. Также в false будут преобразованы значения null и undefined.
Видно, что JavaScript изо всех сил пытается правильно выполнить даже некорректно написанные выражения. Иногда это получается, но чаще все работает не так, как планировалось, и, в конце концов, выполнение Web-сценария прерывается в связи с обнаружением ошибки совсем в другом его месте, на абсолютно верном операторе. Поэтому лучше не допускать подобных казусов.
Приоритет операторов
Последний вопрос, который мы здесь разберем, — приоритет операторов. Как мы помним, приоритет влияет на порядок, в котором выполняются операторы в выражении.
Пусть имеется следующее выражение:
В этом случае сначала к значению переменной b будет прибавлено значение c, а потом из суммы будет вычтено 10. Операторы этого выражения имеют одинаковый приоритет и поэтому выполняются строго слева направо.
Теперь рассмотрим такое выражение:
Здесь сначала будет выполнено умножение значения c на 10, а уже потом к полученному произведению будет прибавлено значение b. Оператор умножения имеет больший приоритет, чем оператор сложения, поэтому порядок «строго слева направо» будет нарушен.
Самый низкий приоритет у операторов присваивания. Вот почему сначала вычисляется само выражение, а потом его результат присваивается переменной.
В общем, основной принцип выполнения всех операторов таков: сначала выполняются операторы с более высоким приоритетом, а уже потом — операторы с более низким. Операторы с одинаковым приоритетом выполняются в порядке их следования (слева направо).
В табл. 14.9 перечислены все изученные нами операторы в порядке убывания их приоритетов.

Запомните эту таблицу. Неправильный порядок выполнения операторов может стать причиной трудно выявляемых ошибок, при которых внешне абсолютно правильное выражение дает неверный результат.
Но что делать, если нам нужно нарушить обычный порядок выполнения операторов? Воспользуемся скобками. При такой записи заключенные в скобки операторы выполняются первыми:
Здесь сначала будет выполнено сложение значений переменных b и c, а потом получившаяся сумма будет умножена на 10.
Операторы, заключенные в скобки, также подчиняются приоритету. Поэтому часто используются многократно вложенные скобки:
a = ((b + c) * 10 — d) / 2 + 9;
Здесь операторы будут выполнены в такой последовательности:
1. Сложение b и c.
2. Умножение полученной суммы на 10.
3. Вычитание d из произведения.
4. Деление разности на 2.
5. Прибавление 9 к частному.
Если удалить скобки:
a = b + c * 10 — d / 2 + 9;
то порядок выполнения операторов будет таким:
1. Умножение c и 10.
2. Деление d на 2.
3. Сложение b и произведения c и 10.
4. Вычитание из полученной суммы частного от деления d на 2.
5. Прибавление 9 к полученной разности.
Получается совсем другой результат, не так ли?
