Поиск…


замечания

  • Метод clz32 не поддерживается в Internet Explorer или Safari

Дополнение (+)

Оператор сложения ( + ) добавляет числа.


var a = 9,
    b = 3,
    c = a + b;

c теперь будет 12

Этот операнд также может использоваться несколько раз в одном назначении:

var a = 9,
    b = 3,
    c = 8,
    d = a + b + c;

d теперь будет 20.


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

null + null;      // 0
null + undefined; // NaN
null + {};        // "null[object Object]"
null + '';        // "null"

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

"123" + 1;        // "1231" (not 124)

Если вместо любого из чисел указывается логическое значение, логическое значение преобразуется в число ( 0 для false , 1 для true ) до вычисления суммы:

true + 1;         // 2
false + 5;        // 5
null + 1;         // 1
undefined + 1;    // NaN

Если логическое значение задано рядом со строковым значением, вместо этого булевское значение преобразуется в строку:

true + "1";        // "true1"
false + "bar";     // "falsebar"

Вычитание (-)

Оператор вычитания ( - ) вычитает числа.


var a = 9;
var b = 3;
var c = a - b;

c теперь будет 6

Если вместо числового значения указывается строка или логическое значение, она преобразуется в число до того, как вычисляется разница ( 0 для false , 1 для true ):

"5" - 1;     // 4
7 - "3";     // 4
"5" - true;  // 4

Если строковое значение не может быть преобразовано в число, результатом будет NaN :

"foo" - 1;      // NaN
100 - "bar";    // NaN

Умножение (*)

Оператор умножения ( * ) выполняет арифметическое умножение на числа (литералы или переменные).

console.log( 3 *  5); //  15
console.log(-3 *  5); // -15
console.log( 3 * -5); // -15
console.log(-3 * -5); //  15

Отдел (/)

Оператор деления ( / ) выполняет арифметическое деление на числа (литералы или переменные).

console.log(15 / 3); // 5
console.log(15 / 4); // 3.75

Остаток / Модуль (%)

Оператор остатка / модуля ( % ) возвращает остаток после (целочисленного) деления.

console.log( 42 %  10); //  2
console.log( 42 % -10); //  2
console.log(-42 %  10); // -2
console.log(-42 % -10); // -2
console.log(-40 %  10); // -0
console.log( 40 %  10); //  0

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

В приведенном выше примере 10 можно вычесть четыре раза с 42 до того, как осталось недостаточно левого, чтобы вычесть его без изменения знака. Остальная часть: 42 - 4 * 10 = 2 .

Оператор остатка может быть полезен для следующих задач:

  1. Проверьте, если целое число (не) делится на другое число:

     x % 4 == 0 // true if x is divisible by 4
     x % 2 == 0 // true if x is even number
     x % 2 != 0 // true if x is odd number
    

    Так как 0 === -0 , это также работает при x <= -0 .

  2. Внедрение циклического приращения / уменьшения значения в интервале [0, n) .

Предположим, что нам нужно увеличивать целочисленное значение от 0 до (но не включая) n , поэтому следующее значение после n-1 становится равным 0 . Это можно сделать с помощью такого псевдокода:

var n = ...; // given n
var i = 0;
function inc() {
    i = (i + 1) % n;
}
while (true) {
    inc();
    // update something with i
}

Теперь обобщите приведенную выше проблему и предположим, что нам нужно разрешить и увеличивать и уменьшать это значение от 0 до (не включая) n , поэтому следующее значение после n-1 становится равным 0 а предыдущее значение до 0 становится n-1 .

var n = ...; // given n
var i = 0;
function delta(d) { // d - any signed integer
    i = (i + d + n) % n; // we add n to (i+d) to ensure the sum is positive
}

Теперь мы можем вызвать функцию delta() передавая любое целое число, как положительное, так и отрицательное, в качестве дельта-параметра.


Используя модуль для получения дробной части числа

 var myNum = 10 / 4;       // 2.5
 var fraction = myNum % 1; // 0.5
 myNum = -20 / 7;          // -2.857142857142857
 fraction = myNum % 1;     // -0.857142857142857

Приращение (++)

Оператор Increment ( ++ ) увеличивает его операнд на единицу.

  • Если используется как постфикс, то он возвращает значение перед приращением.
  • Если он используется в качестве префикса, он возвращает значение после инкремента.

//postfix
var a = 5,    // 5
    b = a++,  // 5
    c = a     // 6

В этом случае значение a увеличивается после установки b . Итак, b будет 5, а c будет 6.


//prefix
var a = 5,    // 5
    b = ++a,  // 6
    c = a     // 6

В этом случае значение a увеличивается до установки b . Итак, b будет 6, а c будет 6.


Операторы приращения и декремента обычно используются for циклов, например:

for(var i = 0; i < 42; ++i)
{
  // do something awesome!
}

Обратите внимание, как используется префиксный вариант. Это гарантирует, что временная переменная не создается бесполезно (чтобы вернуть значение до операции).

Сокращение (-)

Оператор декремента ( -- ) уменьшает числа на единицу.

  • Если используется как постфикс n , оператор возвращает текущий n а затем присваивает декрементированное значение.
  • Если используется как префикс n , оператор присваивает уменьшенное n и затем возвращает измененное значение.
var a = 5,    // 5
    b = a--,  // 5
    c = a     // 4

В этом случае b устанавливается на начальное значение a . Итак, b будет 5, а c будет 4.

var a = 5,    // 5
    b = --a,  // 4
    c = a     // 4

В этом случае b устанавливается в новое значение a . Итак, b будет 4, а c будет 4.

Обычное использование

Операторы декремента и приращения обычно используются for циклов, например:

for (var i = 42; i > 0; --i) {
  console.log(i)
}

Обратите внимание, как используется префиксный вариант. Это гарантирует, что временная переменная не создается бесполезно (чтобы вернуть значение до операции).

Примечание. Ни -- ни ++ не похожи на обычные математические операторы, а скорее являются очень сжатыми операторами для назначения . Несмотря на возвращаемое значение, x-- и - x --x на x , так что x = x - 1 .

const x = 1;
console.log(x--)  // TypeError: Assignment to constant variable.
console.log(--x)  // TypeError: Assignment to constant variable.
console.log(--3)  // ReferenceError: Invalid left-hand size expression in prefix operation.
console.log(3--)  // ReferenceError: Invalid left-hand side expression in postfix operation.

Экспоненциальность (Math.pow () или **)

Экспоненциальность делает второй операнд мощностью первого операнда (a b ).

var a = 2,
    b = 3,
    c = Math.pow(a, b);

c теперь будет 8

6

Этап 3 ES2016 (ECMAScript 7) Предложение:

let a = 2,
    b = 3,
    c = a ** b;

c теперь будет 8


Используйте Math.pow, чтобы найти n-й корень из числа.

Нахождение n-го корня является обратным повышению до n-й степени. Например, 2 для мощности 5 равно 32 . Пятый корень из 32 равен 2 .

Math.pow(v, 1 / n); // where v is any positive real number 
                    // and n is any positive integer

var a = 16;
var b = Math.pow(a, 1 / 2);  // return the square root of 16 = 4
var c = Math.pow(a, 1 / 3);  // return the cubed root of 16 = 2.5198420997897464
var d = Math.pow(a, 1 / 4);  // return the 4th root of 16 = 2

Константы

Константы Описание приближенный
Math.E База натурального логарифма e 2,718
Math.LN10 Естественный логарифм 10 2,302
Math.LN2 Естественный логарифм 2 0,693
Math.LOG10E Основание 10 логарифм е 0,434
Math.LOG2E База 2 логарифм е 1,442
Math.PI Pi: отношение окружности окружности к диаметру (π) 3,14
Math.SQRT1_2 Квадратный корень из 1/2 0,707
Math.SQRT2 Квадратный корень из 2 1,414
Number.EPSILON Разница между одним и наименьшим значением больше единицы, представляемой как число 2.2204460492503130808472633361816E-16
Number.MAX_SAFE_INTEGER Наибольшее целое число n такое, что n и n + 1 оба точно представлены в виде числа 2 ^ 53 - 1
Number.MAX_VALUE Наибольшее положительное конечное значение числа 1.79E + 308
Number.MIN_SAFE_INTEGER Наименьшее целое число n такое, что n и n - 1 точно представляются как число - (2 ^ 53 - 1)
Number.MIN_VALUE Наименьшее положительное значение для Number 5E-324
Number.NEGATIVE_INFINITY Значение отрицательной бесконечности (-∞)
Number.POSITIVE_INFINITY Значение положительной бесконечности (∞)
Infinity Значение положительной бесконечности (∞)

тригонометрия

Все углы внизу находятся в радианах. Угол r в радианах имеет показатель 180 * r / Math.PI в градусах.

Синус

Math.sin(r);

Это вернет синус r , значение от -1 до 1.

Math.asin(r);

Это вернет арксину (обратную сторону синуса) r .

Math.asinh(r)

Это вернет гиперболический арксинус r .

Косинус

Math.cos(r);

Это вернет косинус r , значение от -1 до 1

Math.acos(r);

Это вернет арккозин (обратный косинус) r .

Math.acosh(r);

Это вернет гиперболический арккозин r .

касательный

Math.tan(r);

Это вернет тангенс r .

Math.atan(r);

Это вернет арктангенс (обратное касательной) r . Обратите внимание, что он вернет угол в радианах между -π/2 и π/2 .

Math.atanh(r);

Это вернет гиперболический арктангенс r .

Math.atan2(x, y);

Это вернет значение угла от (0, 0) до (x, y) в радианах. Он вернет значение между и π , не включая π.

округление

округление

Math.round() округляет значение до ближайшего целого числа, используя половину округления до разрыва связей.

var a = Math.round(2.3);       // a is now 2  
var b = Math.round(2.7);       // b is now 3
var c = Math.round(2.5);       // c is now 3

Но

var c = Math.round(-2.7);       // c is now -3
var c = Math.round(-2.5);       // c is now -2

Обратите внимание, как -2.5 округляется до -2 . Это связано с тем, что значения на полпути всегда округляются, то есть округляются до целого числа со следующим более высоким значением.


Округления

Math.ceil() будет округлять значение вверх.

var a = Math.ceil(2.3);        // a is now 3
var b = Math.ceil(2.7);        // b is now 3

ceil ИНГ отрицательное число округляет к нулю

var c = Math.ceil(-1.1);       // c is now 1

Округление

Math.floor() будет округлять значение вниз.

var a = Math.floor(2.3);        // a is now 2
var b = Math.floor(2.7);        // b is now 2

floor ИНГ отрицательного числа будет округлить от нуля.

var c = Math.floor(-1.1);       // c is now -1

Усечение

Предостережение : использование побитовых операторов (кроме >>> ) применяется только к номерам между -2147483649 и 2147483648 .

2.3  | 0;                       // 2 (floor)
-2.3 | 0;                       // -2 (ceil)
NaN  | 0;                       // 0
6

Math.trunc()

Math.trunc(2.3);                // 2 (floor)
Math.trunc(-2.3);               // -2 (ceil)
Math.trunc(2147483648.1);       // 2147483648 (floor)
Math.trunc(-2147483649.1);      // -2147483649 (ceil)
Math.trunc(NaN);                // NaN

Округление до десятичных знаков

Math.floor , Math.ceil() и Math.round() могут использоваться для округления до нескольких десятичных знаков

Чтобы округлить до двух знаков после запятой:

 var myNum = 2/3;               // 0.6666666666666666
 var multiplier = 100;
 var a = Math.round(myNum * multiplier) / multiplier;  // 0.67
 var b = Math.ceil (myNum * multiplier) / multiplier;  // 0.67
 var c = Math.floor(myNum * multiplier) / multiplier;  // 0.66

Вы также можете округлить до нескольких цифр:

 var myNum = 10000/3;           // 3333.3333333333335
 var multiplier = 1/100;
 var a = Math.round(myNum * multiplier) / multiplier;  // 3300
 var b = Math.ceil (myNum * multiplier) / multiplier;  // 3400
 var c = Math.floor(myNum * multiplier) / multiplier;  // 3300

В качестве более удобной функции:

 // value is the value to round
 // places if positive the number of decimal places to round to
 // places if negative the number of digits to round to
 function roundTo(value, places){
     var power = Math.pow(10, places);
     return Math.round(value * power) / power;
 }
 var myNum = 10000/3;    // 3333.3333333333335
 roundTo(myNum, 2);  // 3333.33
 roundTo(myNum, 0);  // 3333
 roundTo(myNum, -2); // 3300

И варианты для ceil и floor :

 function ceilTo(value, places){
     var power = Math.pow(10, places);
     return Math.ceil(value * power) / power;
 }
 function floorTo(value, places){
     var power = Math.pow(10, places);
     return Math.floor(value * power) / power;
 }

Случайные целые числа и поплавки

var a = Math.random();

Примерное значение a : 0.21322848065742162

Math.random() возвращает случайное число между 0 (включительно) и 1 (эксклюзивным)

function getRandom() {
    return Math.random();
}

Чтобы использовать Math.random() для получения числа из произвольного диапазона (не [0,1) ), используйте эту функцию для получения случайного числа между min (включительно) и max (exclusive): интервал [min, max)

function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

Чтобы использовать Math.random() для получения целого числа из произвольного диапазона (не [0,1) ), используйте эту функцию для получения случайного числа между min (включительно) и max (эксклюзивным): интервал [min, max)

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

Чтобы использовать Math.random() для получения целого числа из произвольного диапазона (не [0,1) ), используйте эту функцию для получения случайного числа между min (включительно) и max (включительно): интервал [min, max]

function getRandomIntInclusive(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

Функции, взятые из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

Побитовые операторы

Обратите внимание, что все побитовые операции работают с 32-битными целыми числами, передавая любые операнды во внутреннюю функцию ToInt32 .

Побитовое или

var a;
a = 0b0011 | 0b1010; // a === 0b1011
// truth table
// 1010 | (or)
// 0011  
// 1011  (result)

Побитовое и

a = 0b0011 & 0b1010; // a === 0b0010
// truth table
// 1010 & (and)
// 0011  
// 0010  (result)

побитовое не

a = ~0b0011; // a === 0b1100
// truth table
// 10 ~(not)
// 01  (result)

Побитовое xor (эксклюзивное или)

a = 0b1010 ^ 0b0011; // a === 0b1001
// truth table
// 1010 ^ (xor)
// 0011  
// 1001  (result)

Побитовый сдвиг влево

a = 0b0001 << 1; // a === 0b0010
a = 0b0001 << 2; // a === 0b0100
a = 0b0001 << 3; // a === 0b1000

Сдвиг влево эквивалентен целочисленному умножению на Math.pow(2, n) . При выполнении целочисленной математики сдвиг может значительно улучшить скорость некоторых математических операций.

var n = 2;
var a = 5.4;
var result = (a << n) === Math.floor(a) * Math.pow(2,n);
// result is true
a = 5.4 << n; // 20

Побитовое смещение вправо >> ( сдвиг смены знака) >>> (нулевой сдвиг вправо)

a = 0b1001 >> 1; // a === 0b0100
a = 0b1001 >> 2; // a === 0b0010
a = 0b1001 >> 3; // a === 0b0001

a = 0b1001 >>> 1; // a === 0b0100
a = 0b1001 >>> 2; // a === 0b0010
a = 0b1001 >>> 3; // a === 0b0001

Отрицательное 32-битное значение всегда имеет самый большой бит:

a = 0b11111111111111111111111111110111 | 0;   
console.log(a); // -9
b = a >> 2;     // leftmost bit is shifted 1 to the right then new left most bit is set to on (1)
console.log(b); // -3
b = a >>> 2;    // leftmost bit is shifted 1 to the right. the new left most bit is set to off (0)
console.log(b); // 2147483643

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

Правый сдвиг на положительных числах является эквивалентом деления на Math.pow(2,n) и настилания результата:

a = 256.67;
n = 4;
result = (a >> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is true
a = a >> n; //  16

result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is true
a = a >>> n; //  16

Значение нулевой нулевой сдвига ( >>> ) на отрицательных числах отличается. Поскольку JavaScript не конвертирует в unsigned ints при выполнении операций с битами, нет никакого операционного эквивалента:

a = -256.67;
result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is false

Операторы битового присваивания

За исключением не ( ~ ) все вышеперечисленные побитовые операторы могут использоваться как операторы присваивания:

a |= b;   // same as: a = a | b;
a ^= b;   // same as: a = a ^ b;
a &= b;   // same as: a = a & b;
a >>= b;  // same as: a = a >> b;
a >>>= b; // same as: a = a >>> b;
a <<= b;  // same as: a = a << b;

Внимание : Javascript использует Big Endian для хранения целых чисел. Это не всегда будет соответствовать Endian устройства / ОС. При использовании типизированных массивов с длиной бит, превышающей 8 бит, вы должны проверить, есть ли среда Little Endian или Big Endian, прежде чем применять побитовые операции.

Предупреждение : Побитовые операторы, такие как & и | не совпадают с логическими операторами && (и) и || (или) . Они будут предоставлять неверные результаты при использовании в качестве логических операторов. Оператор ^ не является силовым оператором ( a b ) .

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

Возвращает случайное целое число между min и max :

function randomBetween(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

Примеры:

// randomBetween(0, 10);
Math.floor(Math.random() * 11);

// randomBetween(1, 10);
Math.floor(Math.random() * 10) + 1;

// randomBetween(5, 20);
Math.floor(Math.random() * 16) + 5;

// randomBetween(-10, -2);
Math.floor(Math.random() * 9) - 10;

Случайное с гауссовским распределением

Функция Math.random() должна давать случайные числа, которые имеют стандартное отклонение, приближающееся к 0. При выборе из колоды карты или имитации рулона кости это то, что мы хотим.

Но в большинстве ситуаций это нереально. В реальном мире случайность имеет тенденцию собираться вокруг общего нормального значения. Если вы построили график на графике, вы получите классическую колоколообразную кривую или распределение по гауссову.

Сделать это с помощью функции Math.random() относительно просто.

var randNum = (Math.random() + Math.random()) / 2; 
var randNum = (Math.random() + Math.random() + Math.random()) / 3; 
var randNum = (Math.random() + Math.random() + Math.random() + Math.random()) / 4; 

Добавление случайного значения к последнему увеличивает дисперсию случайных чисел. Разделение на количество добавленных вами значений приводит к получению результата в диапазоне 0-1

Поскольку добавление более чем нескольких рандомов беспорядочно, простая функция позволит вам выбрать желаемую дисперсию.

// v is the number of times random is summed and should be over >= 1
// return a random number between 0-1 exclusive
function randomG(v){ 
    var r = 0;
    for(var i = v; i > 0; i --){
        r += Math.random();
    }
    return r / v;
}

Прогрессия точности распределения колоколообразной кривой с возрастающими значениями v.

На изображении показано распределение случайных значений для разных значений v. Верхний левый - стандартный одиночный Math.random() нижний правый - Math.random() суммирован 8 раз. Это от 5 000 000 образцов с использованием Chrome

Этот метод наиболее эффективен при v<5

Потолок и пол

ceil()

Метод ceil() округляет число вверх до ближайшего целого числа и возвращает результат.

Синтаксис:

Math.ceil(n);

Пример:

console.log(Math.ceil(0.60)); //  1
console.log(Math.ceil(0.40)); //  1
console.log(Math.ceil(5.1));  //  6
console.log(Math.ceil(-5.1)); // -5
console.log(Math.ceil(-5.9)); // -5

floor()

Метод floor() округляет число вниз до ближайшего целого числа и возвращает результат.

Синтаксис:

Math.floor(n);

Пример:

console.log(Math.ceil(0.60)); //  0
console.log(Math.ceil(0.40)); //  0
console.log(Math.ceil(5.1));  //  5
console.log(Math.ceil(-5.1)); // -6
console.log(Math.ceil(-5.9)); // -6

Math.atan2 найти направление

Если вы работаете с векторами или линиями, вы на какой-то стадии хотите получить направление вектора или линии. Или направление от точки к другой точке.

Math.atan(yComponent, xComponent) возвращает угол в радиусе в диапазоне от -Math.PI до Math.PI (от -180 до 180 градусов)

Направление вектора

var vec = {x : 4, y : 3};
var dir = Math.atan2(vec.y, vec.x);  // 0.6435011087932844

Направление линии

var line = {
    p1 : { x : 100, y : 128},
    p2 : { x : 320, y : 256}
}
// get the direction from p1 to p2
var dir = Math.atan2(line.p2.y - line.p1.y, line.p2.x - line.p1.x); // 0.5269432271894297

Направление от точки к другой точке

var point1 = { x: 123, y : 294};
var point2 = { x: 354, y : 284};
// get the direction from point1 to point2
var dir = Math.atan2(point2.y - point1.y, point2.x - point1.x); // -0.04326303140726714

Sin & Cos для создания векторного направления и расстояния

Если у вас есть вектор в полярной форме (направление и расстояние), вы захотите преобразовать его в декартовой вектор с компонентом ax и y. Для ссылки система координат экрана имеет направления как 0 град. Точек слева направо, 90 (PI / 2) указывают вниз по экрану и т. Д. В часовом направлении.

var dir = 1.4536; // direction in radians
var dist = 200; // distance
var vec = {};
vec.x = Math.cos(dir) * dist; // get the x component
vec.y = Math.sin(dir) * dist; // get the y component

Вы также можете игнорировать расстояние для создания нормализованного (1 единица длинного) вектора в направлении dir

var dir = 1.4536; // direction in radians
var vec = {};
vec.x = Math.cos(dir); // get the x component
vec.y = Math.sin(dir); // get the y component

Если ваша система координат имеет значение y, то вам нужно переключить cos и sin. В этом случае положительное направление находится против часовой стрелки от оси х.

// get the directional vector where y points up
var dir = 1.4536; // direction in radians
var vec = {};
vec.x = Math.sin(dir); // get the x component
vec.y = Math.cos(dir); // get the y component

Math.hypot

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

var v1 = {x : 10, y :5};
var v2 = {x : 20, y : 10};
var x = v2.x - v1.x;
var y = v2.y - v1.y;
var distance = Math.sqrt(x * x + y * y); // 11.180339887498949

В ECMAScript 6 появился Math.hypot который делает то же самое

var v1 = {x : 10, y :5}; 
var v2 = {x : 20, y : 10}; 
var x = v2.x - v1.x; 
var y = v2.y - v1.y;
var distance = Math.hypot(x,y); // 11.180339887498949

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

var v1 = {x : 10, y :5};
var v2 = {x : 20, y : 10};
var distance = Math.hypot(v2.x - v1.x, v2.y - v1.y); // 11.180339887498949

Math.hypot может принимать любое количество измерений

// find distance in 3D
var v1 = {x : 10, y : 5, z : 7};
var v2 = {x : 20, y : 10, z : 16};
var dist = Math.hypot(v2.x - v1.x, v2.y - v1.y, v2.z - v1.z); // 14.352700094407325

// find length of 11th dimensional vector
var v = [1,3,2,6,1,7,3,7,5,3,1]; 
var i = 0;
dist = Math.hypot(v[i++],v[i++],v[i++],v[i++],v[i++],v[i++],v[i++],v[i++],v[i++],v[i++],v[i++]);

Периодические функции с использованием Math.sin

Math.sin и Math.cos являются циклическими с периодом 2 * PI радианов (360 град.), Они выводят волну с амплитудой 2 в диапазоне от -1 до 1.

График функции синуса и косинуса: (любезность Wikipedia)

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

В этом примере показано, как создать простую sin-волну с контролем за периодом / частотой, фазой, амплитудой и смещением.

Единица времени используется секундами.
Самая простая форма с контролем только по частоте.

// time is the time in seconds when you want to get a sample
// Frequency represents the number of oscillations per second
function oscillator(time, frequency){  
    return Math.sin(time * 2 * Math.PI * frequency);
}

Почти во всех случаях вы захотите внести некоторые изменения в возвращаемое значение. Общие условия для модификаций

  • Фаза: смещение по частоте от начала колебаний. Это значение в диапазоне от 0 до 1, где значение 0,5 перемещает волну вперед по времени на половину ее частоты. Значение 0 или 1 не изменяет.
  • Амплитуда: расстояние от самого низкого значения и наибольшее значение в течение одного цикла. Амплитуда 1 имеет диапазон 2. Самая низкая точка (прогиб) -1 до самого высокого (пика) 1. Для волны с частотой 1 пик составляет 0,25 секунды, а прогиб - 0,75.
  • Смещение: перемещает всю волну вверх или вниз.

Чтобы включить все это в функцию:

function oscillator(time, frequency = 1, amplitude = 1, phase = 0, offset = 0){
    var t = time * frequency * Math.PI * 2; // get phase at time
    t += phase * Math.PI * 2; // add the phase offset
    var v = Math.sin(t); // get the value at the calculated position in the cycle
    v *= amplitude; // set the amplitude
    v += offset; // add the offset
    return v;
}

Или в более компактной (и немного более быстрой форме):

function oscillator(time, frequency = 1, amplitude = 1, phase = 0, offset = 0){
    return Math.sin(time * frequency * Math.PI * 2 + phase * Math.PI * 2) * amplitude + offset; 
}

Все аргументы, кроме времени, являются необязательными

Моделирование событий с разными вероятностями

Иногда вам может понадобиться только симулировать событие с двумя результатами, возможно, с разными вероятностями, но вы можете оказаться в ситуации, которая требует многих возможных результатов с разными вероятностями. Представим себе, что вы хотите имитировать событие, которое имеет шесть равновероятных результатов. Это довольно просто.

function simulateEvent(numEvents) {
    var event = Math.floor(numEvents*Math.random());
    return event;
}

// simulate fair die
console.log("Rolled a "+(simulateEvent(6)+1));  // Rolled a 2

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

function simulateEvent(chances) {
    var sum = 0;
    chances.forEach(function(chance) {
        sum+=chance;
    });
    var rand = Math.random();
    var chance = 0;
    for(var i=0; i<chances.length; i++) {
        chance+=chances[i]/sum;
        if(rand<chance) {
            return i;
        }
    }
    
    // should never be reached unless sum of probabilities is less than 1
    // due to all being zero or some being negative probabilities
    return -1;
}

// simulate weighted dice where 6 is twice as likely as any other face
// using multiples of likelihood
console.log("Rolled a "+(simulateEvent([1,1,1,1,1,2])+1));  // Rolled a 1

// using probabilities
console.log("Rolled a "+(simulateEvent([1/7,1/7,1/7,1/7,1/7,2/7])+1));  // Rolled a 6

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

var rewards = ["gold coin","silver coin","diamond","god sword"];
var likelihoods = [5,9,1,0];
// least likely to get a god sword (0/15 = 0%, never),
// most likely to get a silver coin (9/15 = 60%, more than half the time)

// simulate event, log reward
console.log("You get a "+rewards[simulateEvent(likelihoods)]);  // You get a silver coin

Маленький / Большой endian для типизированных массивов при использовании побитовых операторов

Чтобы определить конечный элемент устройства

var isLittleEndian = true;
(()=>{
    var buf = new ArrayBuffer(4);
    var buf8 = new Uint8ClampedArray(buf);
    var data = new Uint32Array(buf);
    data[0] = 0x0F000000;
    if(buf8[0] === 0x0f){
        isLittleEndian = false;
    }
})();  

Little-Endian хранит наиболее значимые байты справа налево.

Big-Endian хранит наиболее значимые байты слева направо.

var myNum = 0x11223344 | 0;  // 32 bit signed integer
var buf = new ArrayBuffer(4);
var data8 = new Uint8ClampedArray(buf);
var data32 = new Uint32Array(buf);
data32[0] = myNum; // store number in 32Bit array

Если система использует Little-Endian, то значения 8-битного байта будут

console.log(data8[0].toString(16)); // 0x44
console.log(data8[1].toString(16)); // 0x33
console.log(data8[2].toString(16)); // 0x22
console.log(data8[3].toString(16)); // 0x11

Если система использует Big-Endian, то значения 8-битного байта будут

console.log(data8[0].toString(16)); // 0x11
console.log(data8[1].toString(16)); // 0x22
console.log(data8[2].toString(16)); // 0x33
console.log(data8[3].toString(16)); // 0x44

Пример, где тип Edian важен

var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
// To speed up read and write from the image buffer you can create a buffer view that is 
// 32 bits allowing you to read/write a pixel in a single operation
var buf32 = new Uint32Array(imgData.data.buffer);
// Mask out Red and Blue channels
var mask = 0x00FF00FF; // bigEndian pixel channels Red,Green,Blue,Alpha
if(isLittleEndian){
    mask = 0xFF00FF00; // littleEndian pixel channels Alpha,Blue,Green,Red
}    
var len = buf32.length;
var i = 0;
while(i < len){  // Mask all pixels
    buf32[i] &= mask; //Mask out Red and Blue
}
ctx.putImageData(imgData);

Получение максимальной и минимальной

Функция Math.max() возвращает наибольшее число из нуля или больше.

Math.max(4, 12);   //  12
Math.max(-1, -15); // -1

Функция Math.min() возвращает наименьшее число из нуля или больше.

Math.min(4, 12);   //  4
Math.min(-1, -15); // -15

Получение максимума и минимума из массива:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9],
    max = Math.max.apply(Math, arr),
    min = Math.min.apply(Math, arr);

console.log(max); // Logs: 9
console.log(min); // Logs: 1

Оператор распространения ECMAScript 6, получая максимум и минимум массива:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9],
    max = Math.max(...arr),
    min = Math.min(...arr);

console.log(max); // Logs: 9
console.log(min); // Logs: 1

Ограничить число до минимального / максимального диапазона

Если вам нужно зажать число, чтобы удерживать его внутри определенной границы диапазона

function clamp(min, max, val) {
    return Math.min(Math.max(min, +val), max);
}

console.log(clamp(-10, 10, "4.30")); // 4.3
console.log(clamp(-10, 10, -8));     // -8
console.log(clamp(-10, 10, 12));     // 10
console.log(clamp(-10, 10, -15));    // -10

Пример примера использования (jsFiddle)

Получение корней числа

Квадратный корень

Используйте Math.sqrt() чтобы найти квадратный корень из числа

Math.sqrt(16)   #=> 4

Кубический корень

Чтобы найти корень куба числа, используйте Math.cbrt()

6
Math.cbrt(27)  #=> 3

Поиск nth-корней

Чтобы найти n-й корень, используйте функцию Math.pow() и передайте дробную экспоненту.

Math.pow(64, 1/6) #=> 2


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow