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

JavaScript поддерживает все базовые арифметические операции. Сегодня я расскажу тебе об операторах +, -, *, и /.

Сложение

Оператор + используется в JavaScript, чтобы сложить два значения. Ему нужно два операнда (числа в нашем случае), чтобы правильно работать:

const sum = 2 + 2;                          // 4

Результат получился ровно таким, как мы и ожидали. Два плюс два равно четыре. Но все становится сложнее и запутаннее, когда мы попробуем работать с другими типами данных.

Если один из операндов строка, то второй будет тоже рассматриваться как строка. Эти строки будут склеены вместе, чтобы получить результат.

const numberPlusString = 2 + '2';            // 22
const booleanPlusString = true + 'Story';    // trueStory
const stringPlusString = 'just' + 'Strings'; // justStrings

Также, можно поместить функцию, объект или массив с любой стороны оператора +. В этом случае они сначала будут конвертированы в строки.

const f = () => {return 0};
const obj = {type: 'regular'};
const arr = [1, 2, 3];

console.log('Hello!' + f);                   // Hello!() => {return 0}
console.log(true + obj);                     // true[object Object]
console.log(1 + arr);                        // 11,2,3

Заметь, что большинство объектов станут строками вида [object Object]. Это стандартная реализация toString в JavaScript. Если тебе нужно что-то другое, ты должен писать свою имплементацию функции toString().

const obj = {
  type: 'regular', 
  toString: function () {
  	return JSON.stringify(this);
	},
};

console.log(1 + obj);                         // 1{"type":"regular"}

Интересные вещи происходят, если один из операндов - boolean (переменная логического типа), а другой число. Или оба операнда boolean. В таких случаях, переменные логического типа будут конвертированы в числа. true станет равно 1, а false превратится в 0.

const truePlusTrue = true + true;             // 2
const truePlusFalse = true + false;           // 1
const booleanPlusNumber = true + 5;           // 6

Вычитание, умножение и деление

Базовые правила сложения и выглядят сложно для разных типов данных. Но пока мы работаем с числами, все просто. То же верно и для JavaScript операторов *, / и -.

const subtractionResult = 10 - 2;              // 8
const multiplicationResult = 2 * 2;            // 4
const divisionResult = 10 / 2;                 // 5

Булевы значения также конвертируются в 0 или 1, когда с другой стороны оператора стоит другой boolean или число.

console.log(true / true);                      // 1
console.log(5 * false);                        // 0
console.log(true - false);                     // 1

Infinity и -Infinity

Если ты попробуешь разделить число на 0 или false, то в результате получишь Infinity или -Infinity.

console.log(5 / 0);                             // Infinity
console.log(-5 / false);                        // -Infinity

NaN

В других случаях, когда JavaScript не может нормально посчитать результат выражения, ты получишь NaN. Это специальное “не-число”, сокращение от “not-a-number”.

console.log(false / false);                     // NaN
console.log(10 / 'string');                     // NaN
console.log(5 * {});                            // NaN
console.log({} - [])                            // NaN

Пустой массив

Пустой массив превращается в пустую строку или 0 в зависимости от других операндов.

console.log('str1' + [] + 'str2');               // str1str2
console.log(12 * []);                            // 0
console.log(5 - []);                             // 5
console.log(1 / []);                             // Infinity

Унарный инкремент и декремент в JavaScript

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

Выглядят эти операторы, как двойной плюс ++ и двойной минус --.

let counter = 0;
counter++;
console.log(counter);                             // 1
counter--;
console.log(counter);                             // 0

Операторы ++ и можно написать с любой стороны переменной. Записи counter++ и ++counter сделают почти одно и то же. Разницу покажу на примере:

let i = 0;
console.log(i++);                                 // 0
console.log(i);                                   // 1

Сначала мы берем значение i, выводим на экран и только после этого делаем инкремент. Результат инкремента станет виден во втором console.log.

А если написать ++i, то все будет наоборот. Сначала мы выполним инкремент, а уже потом обновленное значение i попадет в console.log.

let i = 0;
console.log(++i);                                  // 1
console.log(i);                                    // 1

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

let x = 1;
let y = 2;
let z = 3;

console.log(++x - y-- + z++);                       // ?

Вывод

Ты узнал о базовой математике JavaScript, ее правилах и исключениях.

Операции +, -, *, / работают как ожидается с числами, но со строками, объектами, массивами, булевыми переменными и функциями ведут себя иначе.

Понимание базовой математики JS полезно любому веб разработчику.