Вы знакомы с арифметикой? Умеете складывать и вычитать числа? 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;
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
Арифметические операторы и приведение типов
JavaScript поддерживает следующие арифметические операторы:
Интересная особенность JavaScript - возможность выполнять арифметические операции над переменными различного типа. В этом случае интерпретатор самостоятельно выполняет приведение типов и выполняет указанную операцию. В процессе ведения типов используются следующие правила:
1. Если один из операндов - строка, то все остальные операнды приводятся к строковому виду.
Var1 = "Дядя" var2 = "Ваня" result = var1 + " " + var2 // result = "Дядя Ваня" mixed = var2 + 100 // mixed = "Ваня100"
2. Все логические операнды приводятся к числовому виду, кроме случаев, когда все операнды в выражении логические. При этом true приводится к "1", а false - к "0". При сочетании логических операндов со строками - все операдны переводятся в текстовый вид.
Var1 = true var2 = true result = var1 + var2 // result = 2 mixed = var2 + 100 // mixed = 101 var3 = "строка:" str = var3 + var1 // str = "строка:true"
3. Если приведение типов выполнить не удалось - результатом выражения будет "NaN" (например, при попытке разделить строку на что-либо).
Var1 = "Дядя" var2 = "Ваня" result = var1 / var2 // result = "NaN" mixed = var2 * true // mixed = "NaN"
Однако на начальном этапе лучше воздержаться от приведения типов и фокусов с преобраованием результатов. Это избавит вас от значительного числа ошибок.
Объект Math
Объект Math содержит основные математические константы и стандартные математические функции. Наиболее часто используемые приведены в таблице:
Свойства | |
LN10 | Значение натурального логарифма числа 10 |
LN2 | Значение натурального логарифма числа 2 |
PI | Значение числа Пи |
Методы | |
abs(число) | Возвращает абсолютное значение числа (т.е. число без учёта его знака) |
ceil(число) | Откругляет число до ближайшего большего целого (округление "вверх") |
exp(число) | Возвращает число "e" в степени "число" |
floor(число) | Откругляет число до ближайшего меньшего целого (округление "вниз") |
max(число1, число2) | Возвращает большее из двух чисел |
min(число1, число2) | Возвращает меньшее из двух чисел |
pow(число1, число2) | Возвращает "число1", возведённое в степень "число2" |
random() | Возвращает случайное число в диапазоне от 0 до 1 |
round(число) | Округляет число в соответствии со стандартными правилами округления |
sqrt(число) | Возвращает квадратный корень числа. |
Из всех перечисленных функций имеет смысл дополнительно пояснить только ceil(), floor() и round(). Рассмотрим их отличия на примере:
Num = 1.222 // ближайшее целое "вниз" - 1 // ближайшее целое "вверх" - 2 // арифметически откругляется до 1 alert(Math.ceil(num)) alert(Math.floor(num)) alert(Math.round(num)) // получим три сообщения: 2, 1, 1 num = 1.777 // ближайшее целое "вниз" - 1 // ближайшее целое "вверх" - 2 // арифметически откругляется до 2 alert(Math.ceil(num)) alert(Math.floor(num)) alert(Math.round(num)) // получим три сообщения: 2, 1, 2
Набор математических функций JavaScript позволяет решать довольно большой спектр задач, но злоупортеблять этим не стоит. Не забывайте, что код исполняется инетрпретатором, а вот о низкоуровневой оптимизации вычислений нет и речи, следовательно высокого быстродействия добиться будет очень сложно.
Операторы: - (вычитание ), + (сложение ), * (умножение ) и / (деление ) работают точно так же, как и арифметические действия в математике. Оператор % (деление с остатком ) возвращает остаток от деления первого операнда на второй. Результат деления с остатком будет иметь тот же знак, что и первый операнд:
Alert(10 + 2); // 12 alert(10 - 2); // 8 alert(10 * 2); // 20 alert(10 / 2); // 5 alert(5 % 2); // 1 alert(-5 % 2); // -1
Оператор ** (возведение в степень ) имеет два операнда. Первый операнд является основанием степени, второй операнд - показателем степени, в результате оператор возвращает основание, возведённое в указанную степень:
2 ** 4; // 16
Все математические операторы преобразуют операнды по тем же правилам, что и функция Number() .
Унарные + (плюс) и - (минус)
Оператор + (унарный плюс ) преобразует значение своего операнда в число и возвращает преобразованное значение. При использовании с числовым операндом он не выполняет никаких действий:
Var x = +"5";
Оператор - (унарный минус ) преобразует значение своего операнда в число, если это необходимо, и затем делает число отрицательным:
Var x = -5 + 3;
Унарные плюс и минус преобразуют операнды по тем же правилам, что и функция Number() .
Инкремент и декремент
Оператор ++ (инкремент ) увеличивает значение своего операнда на единицу. Если значение операнда не является числом, оператор автоматически преобразует его в число, увеличивает на единицу и возвращает результат, который присваивается обратно операнду.
Инкремент имеет две формы - постфиксную (оператор ставится после операнда) и префиксную (оператор ставится перед операндом). Если он используется в постфиксной форме, то сначала возвращается исходное значение операнда, и только затем значение операнда увеличивается на единицу.
Очень часто вычисления в JavaScript дают не совсем те результаты, которые мы хотим. Разумеется, мы можем делать с числами что угодно - округлять в большую или меньшую сторону, устанавливать диапазоны, отсекать ненужные числа до определенного количества знаков после запятой, все зависит от того, что вы хотите сделать в дальнейшем с этим числом.Зачем необходимо округление?
Одним из любопытных аспектов JavaScript является то, что он на самом деле не хранит целые числа, мы сразу же работаем с числами с плавающей точкой. Это, в сочетании с тем фактом, что многие дробные значения не могут быть выражены конечным числом знаков после запятой, в JavaScript мы можем получить такие результаты:0.1 * 0.2;
> 0.020000000000000004
0.3 - 0.1
> 0.19999999999999998
Для практических целей эта неточность не имеет никакого значения, в нашем случае мы говорим об ошибке в квинтиллионных долях, однако, кого-то это может разочаровать. Мы можем получить несколько странный результат и при работе с числами, которые представляют собой значения валют, процентов или размеров файла. Для того, чтобы исправить эти неточности, нам как раз и необходимо уметь округлять результаты, при этом достаточно установить десятичную точность.
Округление чисел имеет практическое применение, мы можем манипулировать числом в некотором диапазоне, например, хотим округлить значение до ближайшего целого числа, а не работать только с десятичной частью.
Округление десятичных чисел
Для того, чтобы отсечь десятичное число, используйте toFixed или метод toPrecision . Оба они принимают единственный аргумент, который определяет, соответственно, сколько значащих цифр (т.е. общее количество цифр, используемых в числе) или знаков после запятой (количество после десятичной точки) должен включать в себя результат:- Если аргумент не определен для toFixed(), то по умолчанию он будет равен нулю, что означает 0 знаков после запятой, аргумент имеет максимальное значение, равное 20.
- Если аргумент не задан для toPrecision, число остается нетронутым
Оба метода toFixed() и toPrecision() возвращают строковое представление результата, а не число. Это означает, что при суммировании округленного значения с randNum будет произведена конкатенация строк, а не сумма чисел:
Let randNum = 6.25;
let rounded = randNum.toFixed(); // "6"
console.log(randNum + rounded);
> "6.256"
Если вы хотите, чтобы результат имел числовой тип данных, то вам необходимо будет применить parseFloat:
Let randNum = 6.25;
let rounded = parseFloat(randNum.toFixed(1));
console.log(rounded);
> 6.3
Обратите внимание, что значения 5 округлены, за исключением редких случаев.
Методы toFixed() и toPrecision() являются полезными, ибо они могут не только отсекать дробную часть, но и дополнять знаки после запятой, что удобно при работе с валютой:
Let wholeNum = 1
let dollarsCents = wholeNum.toFixed(2);
console.log(dollarsCents);
> "1.00"
Стоить обратите внимание, что toPrecision будет давать результат в экспоненциальной записи, если число целых чисел больше, чем сам сама точность:
Let num = 123.435 num.toPrecision(2); > "1.2e+2"
Как избежать ошибок округления с десятичными числами
В некоторых случаях, toFixed и toPrecision округляет значение 5 в меньшую сторону, а в большую:Let numTest = 1.005;
numTest.toFixed(2);
> "1.00"
Результат расчета выше должен был быть 1.01, а не 1. Если вы хотите избежать подобную ошибку, мы можем использовать решение, предложенное Jack L Moore , которое использует экспоненциальные числа для расчета:
Function round(value, decimals) {
return Number(Math.round(value+"e"+decimals)+"e-"+decimals);
}
Теперь:
Round(1.005,2);
> 1.01
Если вы хотите более надежное решение, чем решение показанное выше, вы можете перейти на MDN .
Машинное эпсилон округление
Альтернативный метод округления десятичных чисел был введен в ES6. Машинное эпсилон округление обеспечивает разумный предел погрешности при сравнении двух чисел с плавающей точкой. Без округления, сравнения могут дать результаты, подобные следующим:0.1 + 0.2 === 0.3
> false
Мы используем Math.EPSILON в нашей функции для получения корректного сравнения:
Function epsEqu(x, y) {
return Math.abs(x - y) < Number.EPSILON * Math.max(Math.abs(x), Math.abs(y));
}
Функция принимает два аргумента: первый - текущий расчет, второй - ожидаемый результат. Она возвращает сравнение двух:
EpsEqu(0.1 + 0.2, 0.3)
> true
Все современные браузеры уже поддерживают ES6 математические функции, но если вы хотите получить поддержку в таких браузерах, как IE 11, используйте polyfills .
Отсечение дробной части
Все методы, представленные выше умеют округлять до десятичных чисел. Для того, чтобы просто отсечь число до двух знаков после запятой, необходимо сначала умножить его на 100, а затем полученный результат уже разделить на 100:Function truncated(num) {
return Math.trunc(num * 100) / 100;
}
truncated(3.1416)
> 3.14
Если вы хотите приспособить метод под любое количество знаков после запятой, вы можете воспользоваться двойным побитовым отрицанием :
Function truncated(num, decimalPlaces) {
let numPowerConverter = Math.pow(10, decimalPlaces);
return ~~(num * numPowerConverter)/numPowerConverter;
}
Теперь:
Let randInt = 35.874993; truncated(randInt,3); > 35.874
Округление до ближайшего числа
Для того, чтобы округлить десятичное число до ближайшего числа в большую или в меньшую сторону, в зависимости от того, к чему мы ближе всего, используйте Math.round():Math.round(4.3)
> 4
Math.round(4.5)
> 5
Обратите внимание, что «половина значения», 0.5 округляется в большую сторону по правилам математики .
Округление к меньшему до ближайшего целого числа
Если вы хотите всегда округлять в меньшую сторону, используйте Math.floor:Math.floor(42.23);
> 42
Math.floor(36.93);
> 36
Обратите внимание, что округление в меньшую сторону работает для всех чисел, в том числе и для отрицательных. Представьте небоскреб с бесконечным количеством этажей, в том числе с этажами нижнего уровня (представляющий отрицательные числа). Если вы находитесь в лифте на нижним уровнем между 2 и 3 (что представляет собой значение -2.5), Math.floor доставит вас до -3:
Math.floor(-2.5);
> -3
Но если вы хотите избежать подобной ситуации, используйте Math.trunc , поддерживаемый во всех современных браузерах (кроме IE / Edge):
Math.trunc(-41.43);
> -41
На MDN вы найдете polyfill, который обеспечит поддержку Math.trunc в браузерах и IE / Edge.
Округление к большему до ближайшего целого числа
С другой стороны, если вам нужно всегда округлять в большую сторону, используйте Math.ceil. Опять же, вспоминаем бесконечный лифт: Math.ceil всегда будет идти «вверх», независимо от того, является ли число отрицательное или нет:Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); > -36
Округление до большего/меньшего необходимого числа
Если мы хотим, чтобы округлить до ближайшего числа, кратного 5, самый простой способ создать функцию, которая делит число на 5, округляет его, а затем умножает его на ту же сумму:Function roundTo5(num) {
return Math.round(num/5)*5;
}
Теперь:
RoundTo5(11);
> 10
Если вы хотите округлять до кратных своему значению, мы использовать более общую функцию, передавая в нее начальное значение и кратное:
Function roundToMultiple(num, multiple) {
return Math.round(num/multiple)*multiple;
}
Теперь:
Let initialNumber = 11; let multiple = 10; roundToMultiple(initialNumber, multiple); > 10;
Фиксирование числа в диапазоне
Есть много случаев, когда мы хотим получить значение х, лежащее в пределах диапазона. Например, нам может понадобиться значение от 1 до 100, но при этом мы получили значение 123. Для того, чтобы исправить это, мы можем использовать минимальное (возвращает наименьшее из набора чисел) и максимальное (возвращает наибольшее из любого множества чисел). В нашем примере, диапазон от 1 до 100:Let lowBound = 1;
let highBound = 100;
let numInput = 123;
let clamped = Math.max(lowBound, Math.min(numInput, highBound));
console.log(clamped);
> 100;
Опять же, мы можем переиспользовать операцию и обернуть все это в функцию, воспользуемся решением предложенное Daniel X. Moore :
Number.prototype.clamp = function(min, max) {
return Math.min(Math.max(this, min), max);
};
Теперь:
NumInput.clamp(lowBound, highBound); > 100;
Гауссово округление
Гауссово округление, также известное как банковское округлением, заключается в том, что округление для этого случая происходит к ближайшему чётному. Этот метод округления работает без статистической погрешности. Лучшее решение было предложено Tim Down :Function gaussRound(num, decimalPlaces) {
let d = decimalPlaces || 0,
m = Math.pow(10, d),
n = +(d ? num * m: num).toFixed(8),
i = Math.floor(n), f = n - i,
e = 1e-8,
r = (f > 0.5 - e && f < 0.5 + e) ?
((i % 2 == 0) ? i: i + 1) : Math.round(n);
return d ? r / m: r;
}
Теперь:
GaussRound(2.5)
> 2
gaussRound(3.5)
> 4
gaussRound(2.57,1)
> 2.6
Десятичный знак в CSS:
Так как JavaScript часто используется для создания позиционного преобразования HTML-элементов, вы можете задаться вопросом, что произойдет, если мы cгенерируем десятичные значения для наших элементов:
#box { width: 63.667731993px; }
Хорошая новость заключается в том, что современные браузеры будут учитывать десятичные значения в блочной модели, в том числе в процентных или пиксельных единицах измерения.
Сортировка
Очень часто нам приходится сортировать какие-либо элементы, например, у нас есть массив игровых рекордов, при этом они должны быть организованы по убыванию ранга игроков. К сожалению, стандартный метод sort() имеет некоторые удивительные ограничения: он хорошо работает с часто употребляемыми английскими словами, но сразу же ломается при встрече с числами, уникальными символами или словами в верхнем регистре.Сортировка в алфавитном порядке
Казалось бы, сортировки массива по алфавиту должна быть простейшей задачей:Let fruit = ["butternut squash", "apricot", "cantaloupe"];
fruit.sort();
> "apricot", "butternut squash", "cantaloupe"]
Тем не менее мы сталкиваемся с проблемой, как только один из элементов находится в верхнем регистре:
Let fruit = ["butternut squash", "apricot", "Cantalope"];
fruit.sort();
> "Cantaloupe", "apricot", "butternut squash"]
Это связано с тем, что, по умолчанию, сортировщик сравнивает первый символ представленный в Unicode . Unicode - это уникальный код для любого символа, независимо от платформы, независимо от программы, независимо от языка. Например, если смотреть по кодовой таблице символ «a» имеет значение U+0061 (в шестнадцатеричной системе 0x61), в то время как символ «C» имеет код U+0043 (0x43), который идет раньше в Unicode-таблице, чем символ «a».
Чтобы отсортировать массив, который может содержать смешанные регистры первых букв, нам необходимо либо преобразовать все элементы временно в нижний регистру, или определить свой порядок сортировки при помощи метода localeCompare() c некоторыми аргументами. Как правило, для такого случая, лучше сразу создать функцию для многократного использования:
Function alphaSort(arr) {
arr.sort(function (a, b) {
return a.localeCompare(b, "en", {"sensitivity": "base"});
});
}
let fruit = ["butternut squash", "apricot", "Cantaloupe"];
alphaSort(fruit)
>
Если вы хотите получить массив отсортированный в обратный алфавитном порядке, просто поменяйте позициями а и b в функции:
Function alphaSort(arr) {
arr.sort(function (a, b) {
return b.localeCompare(a, "en", {"sensitivity": "base"});
});
}
let fruit = ["butternut squash", "apricot", "Cantaloupe"];
alphaSort(fruit)
> ["Cantaloupe", "butternut squash", "apricot"]
Тут стоит обратить внимание, что localeCompare используется с аргументами, еще надо помнить, что он поддерживается IE11+, для более старых версий IE, мы можем использовать его без аргументов, и в нижнем регистре:
Function caseSort(arr) { arr.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); }); } let fruit = ["butternut squash", "apricot", "Cantaloupe"]; caseSort(fruit) > ["apricot", "butternut squash", "Cantaloupe"]
Числовая сортировка
Все это не относится к тому примеру, о котором мы говорили выше про массив игровых рекордов. С некоторыми числовыми массивами сортировка работает просто идеально, но в какой-то момент результат может быть непредсказуемым:Let highScores = ;
highScores.sort();
>
Дело в том, что метод sort() производит лексикографическую сравнение : а это означает, что числа будут преобразованы в строку и сравнения будут снова проводиться путем сопоставления первого символа этой строки в порядке символов Unicode-таблицы. Поэтому нам снова необходимо определить свой порядок сортировки:
Let highScores = ;
highScores.sort(function(a,b) { return a - b; });
>
Опять же, для сортировки чисел в обратном порядке, поменяйте позициями a и b в функции.
Сортировка JSON-подобной структуры
И наконец, если у нас есть JSON-подобная структура данных , представленная как массив игровых рекордов:Let scores = [
{
"name": "Daniel",
"score": 21768
},
{
"name": "Michael",
"score": 33579
},
{
"name": "Alison",
"score": 38395
}
];
В ES6+, вы можете использовать стрелочные функции:
Scores.sort((a, b) => b.score - a.score));
Для старых браузеров, не имеющих такую поддержку:
Scores.sort(function(a, b) { return a.score - b.score });
Как видите, сортировка в JavaScript это довольно не очевидная вещь, я надеюсь, что эти примеры облегчат как-нибудь жизнь.
Работа со степенными функциями
Возведение в степень - операция, первоначально определяемая как результат многократного умножения натурального числа на себя, квадратный корень из числа a - число, дающее a при возведении в квадрат. Этими функциями мы могли пользоваться постоянно в повседневной жизни на уроках математики, в том числе при вычислении площадей, объемов или даже при физическом моделировании.В JavaScript степенная функция представлена как Math.pow(), в новом стандарте ES7 был представлен новый оператор возведения в степень - " * * ".
Возведение в степень
Для того, чтобы возвести число в n-ую степень, используйте функцию Math.pow(), где первый аргумент это число, которое будет возведено в степень, второй аргумент это показатель степени:Math.pow(3,2)
> 9
Такая форма записи означает 3 в квадрате, или 3 × 3, что приводит к результату 9. Можно привести еще пример, конечно:
Math.pow(5,3);
> 125
То есть, 5 в кубе, или 5 × 5 × 5, равно 125.
ECMAScript 7 - это следующая версия JavaScript, в принципе, мы можем использовать новый предложенный оператор возведения в степень - * *, такая форма записи может быть более наглядной:
3 ** 2
> 9
На данный момент поддержка этого оператора довольно ограниченная , поэтому его не рекомендуется использовать.
Степенная функция может пригодиться в самых разных ситуациях. Простой пример, вычисление количества секунд в часе: Math.pow (60,2).
Квадратный и кубический корень
Math.sqrt() и Math.cbrt() противоположны функции Math.pow(). Как мы помним, квадратный корень из числа a - число, дающее a при возведении в квадрат.Math.sqrt(9)
> 3
В тоже время кубический корень из числа a - число, дающее a при возведении в куб.
Math.cbrt(125)
> 5
Math.cbrt() был введен в спецификацию JavaScript совсем недавно, и поэтому поддерживается только в современных браузерах: Chrome 38+, Firefox и Opera 25+ и Safari 7.1+. Вы заметите, что Internet Explorer отсутствует в этом списке, однако на MDN вы найдете полифилл .
Примеры
Конечно, мы можем использовать и не целые значения в одной из этих функций:Math.pow(1.25, 2);
> 1.5625
Math.cbrt(56.57)
> 3.8387991760286138
Обратите внимание, что это вполне себе работает и при использовании отрицательных значениях аргументов:
Math.pow(-5,2)
> 25
Math.pow(10,-2)
> 0.01
Тем не менее, для квадратного корня это не будет работать:
Math.sqrt(-9)
> NaN
Из математического анализа мы знаем, что под мнимым числом понимают квадратные корни из отрицательных чисел. И это может привести нас к еще одной технике работы с комплексными числами, но это уже другая история.
Вы можете использовать дробные значения в Math.pow(), чтобы найти квадратные и кубические корни чисел. Квадратный корень использует показатель 0.5:
Math.pow(5, 0.5); // = Math.sqrt(5) = 5 ** (1/2)
> 2.23606797749979
Однако, из-за капризов с плавающей точкой, вы не можете точно предположить правильный результат:
Math.pow(2.23606797749979,2)
> 5.000000000000001
В таких ситуациях, вы вам придется прибегать к отсечению знаков у числа или округление до какого-либо значения.
Некоторые, по непонятным причинам в JavaScript путают функцию Math.pow() с Math.exp() , которая является экспоненциальной функцией для чисел, в целом. Примечание: в английском языке «показатель степени» переводится как «exponent», поэтому это скорее относится к англоговорящим, хотя существуют и альтернативные названия показателя степени , такие как index, power.
Математические константы
Работа с математикой в JavaScript облегчается за счет ряда встроенных констант. Эти константы являются свойствами объекта Math. Стоит обратить внимание, что константы пишутся в верхнем регистре, а не CamelCase нотации.Только зарегистрированные пользователи могут участвовать в опросе. , пожалуйста.
Теги: Добавить меткиНапоминаю, что это вводный курс по JavaScript для начинающих . Сегодня мы рассмотрим, какие операторы существуют в JavaScript . Пристегните ремни! Букаф будет много.
Когда у вас есть кучка данных, то с ними нужно что-то сделать. Делами-то как раз и заняты операторы. Они вечно что-то складывают, перемножают, делят, отнимают, сравнивают, присваивают и еще черти чем занимаются. Без операторов в программировании просто каши не сваришь.
В языке JavaScript используются следующие виды операторов:
- Арифметические операторы
- Операторы присваивания
- Операторы сравнения
- Логические операторы
- Строковые операторы
- Условные операторы
Это далеко не полный список, но для начала хватит и этого за глаза. Разберем каждый вид представленных операторов, зачем они нужны и с чем их едят. Поехали!
Арифметические операторы в JavaScript
С арифметическими операторами все вы знакомы еще со школы. Это обычные знаки сложения, вычитания, деления и умножения: + , - , / , * . Соответственно, выполняют они в программировании те же самые функции, что и в обычной математике. Сложностей с этим у вас не возникнет.
Данные, с которыми работают операторы, называются операндами .
2 + 3 // здесь числа 2 и 3 - операнды, а знак + - оператор сложения
Как и в математике у арифметических операторов есть свои приоритеты: умножение и деление имеют более высокий приоритет, чем сложение и вычитание.
2 + 3 * 4 // здесь сначала выполняется умножение, а уже потом сложение
И так же, как в математике, активно используются скобки, чтобы изменить приоритет:
(2 + 3) * 4 // здесь сначала выполняется сложение, а потом умножение
Кстати, знак = тоже оператор. Как мы уже выяснили в статье про , это оператор присваивания, а вовсе не знак равенства. Не забывайте об этом!
Оператор деления по модулю
А теперь рассмотрим более интересные арифметические операторы. И первым станет значок процентов - % . В JavaScript это не проценты от слова совсем. Так в программировании обозначается деление по модулю. Результатом такой операции будет остаток от деления. Например:
100 % 22 // остаток будет равен 12
100 % 10 // остаток будет равен 0
При вычислениях этот оператор имеет тот же приоритет, что и умножение с делением, так что не забывайте ставить скобочки.
Совмещение операторов
Оператор = можно и нужно совмещать с другими операторами, чтобы сократить запись. Пример:
var n = 2; // присваиваем переменной n значение 2
n = n + 3; // присваиваем переменной n новое значение n + 2, получаем 5
То же самое можно записать так:
var n = 2;
n += 3; // равносильно записи n = n + 3
Операторы инкремента ++ и декремента – –
Среди арифметических операторов есть парочка весьма любопытных - инкремент и декремент . Обозначаются соответственно ++ и –– . Первый увеличивает переменную на единицу, а второй уменьшает. Эта фишка очень часто используется в программировании, так как предоставляет массу удобств. Чаще всего ее можно встретить в условных выражениях, но об этом позже.
У обоих операторов есть определенное местоположение в записи. Они могут быть как в префиксной форме (перед переменной) ++n , так и в постфиксной (после переменной) n++ . Разница огромна! Никогда не путайте эти формы и хорошенько запомните их. Если эти операторы стоят перед переменной, то в результате увеличивают ее значение на 1. Но! Если они стоят после переменной, то возвращают исходное значение. Пример:
var n = 2, m = 0;
m = ++n // увеличивает n на 1 (n = 3) и присваивает m тоже значение 3
var n = 2, m = 3;
m = n++ // увеличивает n на 1 (n = 3), но присваивает m предыдущее значение n = 2
С первым примером, уверен, вы легко разберетесь. А вот со вторым могут возникнуть проблемы. Чтобы легче было понять эту штуку и не запутаться, просто представьте, что вы сначала присвоили переменной m значение переменной n , а уже после этого увеличили значение n на единицу. В первом же примере вы сначала увеличили значение n на единицу, а потом уже присвоили это значение переменной m .
На этом с арифметическими операторами все. Разумеется, есть еще куча вариаций и тонкостей использования этих простых операторов, но для начала вам этого будет более чем достаточно.
Операторы сравнения
И снова вспоминаем математику. Знаки знакомы всем и каждому. В программировании они называются операторами сравнения . В JavaScript используются следующие операторы сравнения:
< меньше
> больше
<= меньше или равно
>= больше или равно
== равно
!= не равно
=== строго равно
!== строго не равно
Обратите внимание, что знак «больше или равно» пишется именно так >= , а не => . То есть, стрелка стоит перед знаком равно, а не после него.
Операторы сравнения позволяют сравнивать значения переменных и результатом этой операции всегда выступает булево значение true или false . Обычно их применяют в условных выражениях. От того, что дает результат сравнение зависит, какая часть кода будет выполняться дальше.
В JavaScript можно сравнивать разные типы данных одновременно, например, число и строку:
12345 == "12345" // true
Просто в этом случае строка автоматически преобразуется в число. Строгое же равенство === или неравенство!== используются только при сравнении переменных одинакового типа.
Логические операторы
Логические операции в JavaScript - это одна из довольно мудреных тем для начинающих. С ней стоит хорошенько разобраться, чтобы успешно идти дальше в освоении языка. Они чаще всего применяются вместе с операциями сравнения и выдают булево значение true или false .
Логических операторов три:
&& (И)
|| (ИЛИ)
! (НЕ)
Логический оператор && (И)
Оператор && выполняет операцию «логическое И» над двумя значениями. При этом он возвращает true тогда и только тогда, когда оба операнда имеют значение true . Если же один или оба операнда имеют значение false , то оператор возвращает false . Примеры:
2 < 3 && 4 < 5 // true
2 < 3 && 5 < 4 // false
3 < 2 && 5 < 4 // false
У логических операторов приоритет меньше, чем у операторов сравнения, поэтому в приведенных примерах мы обходимся без скобок. Понятно, что сначала мы сравниваем числа между собой, а уже потом применяем логику.
Логический оператор || (ИЛИ)
С логическим оператором || (ИЛИ) другая песня. Оператор || выполняет операцию «логическое ИЛИ» над двумя операндами. Если один или оба операнда имеют истинное значение, он возвращает истинное значение. Если оба операнда имеют ложные значения, он возвращает ложное значение. Примеры:
2 < 3 || 4 < 5 // true
2 < 3 || 5 < 4 // true
3 < 2 || 5 < 4 // false
У логических операторов есть одна хитрость. Они не любят лишней работы. Как, впрочем, и я. Свои вычисления они всегда начинают слева направо. И если первая часть выражения соответствует их условиям, то остальную часть выражения они даже не вычисляют.
К примеру, если оператор || находит истинное значение в самом начале, то сразу дает истинное значение, а остальное уже не проверяет. Также и оператор && , если находит в самом начале ложное выражение, то сразу дает ложный результат, а остальную часть не проверяет.
И еще одна фишка: приоритет у оператора И && больше, чем у ИЛИ || , поэтому он выполняется раньше:
2 < 3 || 4 < 5 && 5 < 6 // здесь сначала будет выполнено вычисление в правой части, а потом уже в левой
Логический оператор! (НЕ)
Логический оператор! обозначает «логическое НЕ». Он используется только с одним операндом и меняет значение этого операнда на противоположное. Если значение n истинно, то значение!n будет ложным. Так как этот оператор можно прикрутить лишь к одному операнду, то чтобы инвертировать целое выражение, его надо взять в скобки!(n && m) .
Строковые операторы
Про строковые операторы мы уже говорили ранее. Это тот самый плюс + что используется для соединения строковых переменных, или иначе - для конкатенации (сложения строк). Пример:
"Игорь " + "Квентор" == "Игорь Квентор"
Обратите внимание, что в первом слове добавлен пробел перед закрывающей кавычкой. Если его не добавить, то строки сольются в одно слово "ИгорьКвентор" .
У этого оператора есть одна особенность: если в выражении есть хоть одна строка, то он и все остальные аргументы приводит к строковому типу. Например:
Остальные арифметические операторы работают только с числами и всегда приводят аргументы к числу.
Условные операторы
В JavaScript есть два условных оператора if и?: Хотя, если быть точным, то if - это вообще-то управляющая инструкция и довольно обширная, с кучей плюшек и интересных особенностей. Поэтому о ней будет отдельная статья. Пока же рассмотрим более простой условный оператор?:
Обычно этот оператор записывается как?: Но в программах он выглядит иначе. Он имеет три операнда. Первый операнд предшествует символу? , второй стоит между символами? и: третий - после:
условие? значение 1: значение 2
Смысл его работы прост: если выполняется поставленное условие, то возвращается значение 1, если же нет - значение 2. Этот условный оператор часто служит более простой заменой инструкции if , когда в последней нет особой необходимости. При этом и сама запись сокращается и ее легче прочесть.
Пока на этом все!
Надеюсь, с операторам в JavaScript вы теперь немного разобрались. А чтобы мозг не закипел, вот вам короткий мульт для расслабления - Программист может все! :)