Класс Float32Array
описывает типизированный массив, содержащий вещественные числа одинарной точности (4 байта на число):
let arr = new Float32Array([1.2, 2.5]);
console.log(arr); // Float32Array(2) [1.2000000476837158, 2.5]
console.log(Float32Array.BYTES_PER_ELEMENT); // 4
console.log(Float32Array.name); // Float32Array
Создать массив позволяют следующие конструкторы:
<Массив> = new Float32Array();
<Массив> = new Float32Array(<Количество элементов>);
<Массив> = new Float32Array(<Типизированный массив>);
<Массив> = new Float32Array(<Объект, поддерживающий итерации>);
<Массив> = new Float32Array(<ArrayBuffer>[, <byteOffset>[, <length>]]);
Первый конструктор создает массив нулевого размера:
let arr = new Float32Array();
console.log(arr.length); // 0
Второй конструктор позволяет указать количество элементов. Все элементы получат значение 0
:
let arr = new Float32Array(5);
console.log(arr); // Float32Array(5) [0, 0, 0, 0, 0]
Третий конструктор создает массив на основе другого типизированного массива:
let arr1 = new Float32Array([1.2, 2.5, 3.0]);
let arr2 = new Float32Array(arr1);
arr2[0] = 0;
console.log(arr1); // Float32Array(3) [1.2000000476837158, 2.5, 3]
console.log(arr2); // Float32Array(3) [0, 2.5, 3]
Четвертый конструктор в качестве параметра принимает объект, поддерживающий итерации. Можно указать, например, обычный массив или множество:
let arr1 = new Float32Array([1.2, 2.5, 3.0]);
console.log(arr1); // Float32Array(3) [1.2000000476837158, 2.5, 3]
let arr2 = new Float32Array(new Set([1.2, 2.5, 2.5]));
console.log(arr2); // Float32Array(2) [1.2000000476837158, 2.5]
Пятый конструктор создает массив на основе объекта ArrayBuffer
:
let buf = new ArrayBuffer(12);
let arr1 = new Float32Array(buf);
console.log(arr1); // Float32Array(3) [0, 0, 0]
let arr2 = new Float32Array(buf, 4, 2);
console.log(arr2.length); // 2
Обратите внимание: данные не копируются. Два объекта будут ссылаться на один и тот же фрагмент памяти:
let arr1 = new Float32Array([1.2, 2.5, 3.0]);
let arr2 = new Float32Array(arr1.buffer, arr1.byteOffset,
arr1.byteLength / Float32Array.BYTES_PER_ELEMENT);
arr2[0] = 5;
console.log( arr1 ); // Float32Array(3) [5, 2.5, 3]
console.log( arr2 ); // Float32Array(3) [5, 2.5, 3]
Изменились оба массива!
В этом примере мы воспользовались следующими свойствами:
buffer
— содержит ссылку на объект ArrayBuffer
, лежащий в основе массива;byteOffset
— смещение внутри объекта ArrayBuffer
;byteLength
— длина фрагмента в байтах.Для создания массива можно также использовать статический метод from()
:
<Массив> = Float32Array.from(<Объект>[, <Функция>[, <this>]]);
В первом параметре указывается объект, поддерживающий итерации:
let arr1 = Float32Array.from([1.2, 2.5, 3.0]);
console.log(arr1); // Float32Array(3) [1.2000000476837158, 2.5, 3]
Во втором параметре можно указать ссылку на функцию, которая будет вызвана для каждого элемента. Функция имеет следующий формат:
function name(value, index, array) {
return value;
}
Значение, возвращаемое функцией, станет новым значением элемента массива:
let arr = Float32Array.from([1.2, 2.5, 3.0], (value) => {
return value * 2;
});
console.log(arr); // Float32Array(3) [2.4000000953674316, 5, 6]
Создать массив на основе списка значений позволяет статический метод of()
. Значения указываются через запятую:
let arr = Float32Array.of(1.2, 2.5, 3.0);
console.log(arr); // Float32Array(3) [1.2000000476837158, 2.5, 3]
Получить количество элементов массива позволяет свойство length
:
let arr = Float32Array.of(1.2, 2.5, 3.0);
console.log(arr.length); // 3
Размер типизированного массива является фиксированным. Изменить размер после создания объекта нельзя.
Получить значение элемента массива можно, указав его индекс в квадратных скобках. Нумерация элементов массива начинается с нуля:
let arr = Float32Array.of(1.2, 2.5, 3.0);
console.log( arr[0] ); // 1.2000000476837158
console.log( arr[1] ); // 2.5
console.log( arr[2] ); // 3
Если элемент с указанным индексом не существует, то будет возвращено значение undefined
:
console.log( arr[3] ); // undefined
При желании можно изменить значение существующего элемента:
arr[0] = 5.5;
arr[1] = 6.3;
console.log( arr[0] ); // 5.5
console.log( arr[1] ); // 6.300000190734863
С помощью метода fill()
можно заполнить весь массив или только диапазон одинаковым значением. Формат метода:
fill(<Значение>[, <Начало>[, <Конец>]])
В первом параметре указывается вставляемое значение, которое заполнит весь массив или только указанный фрагмент:
let arr = new Float32Array(5);
console.log(arr); // Float32Array(5) [0, 0, 0, 0, 0]
arr.fill(1.5);
console.log(arr); // Float32Array(5) [1.5, 1.5, 1.5, 1.5, 1.5]
В параметре <Начало>
можно указать начальный индекс диапазона (значение по умолчанию: 0
), а в параметре <Конец>
— конечный индекс (значение по умолчанию: число элементов массива). Метод fill()
возвращает ссылку на массив, поэтому можно строить цепочки из вызовов:
let arr = new Float32Array(5);
arr.fill(1.5, 1, 4);
console.log(arr); // Float32Array(5) [0, 1.5, 1.5, 1.5, 0]
С помощью метода set(<Массив>[, <Смещение>])
можно скопировать данные из обычного массива или типизированного массива:
let arr = new Float32Array(5);
arr.set( [1.2, 2.5, 3.0] );
console.log( arr );
// Float32Array(5) [1.2000000476837158, 2.5, 3, 0, 0]
arr.set( [4.3, 5.2], 3 );
console.log( arr );
// Float32Array(5) [1.2000000476837158, 2.5, 3, 4.300000190734863,
// 5.199999809265137]
arr.set( Float32Array.of(6.2, 7.4, 8.1) );
console.log( arr );
// Float32Array(5) [6.199999809265137, 7.400000095367432,
// 8.100000381469727, 4.300000190734863, 5.199999809265137]
Для сохранения значений элементов массива в переменных можно использовать операцию распаковки массива. В этом случае массив указывается справа от оператора =
, а переменные внутри квадратных скобок — слева от оператора =
:
let arr = Float32Array.of(1.2, 2.5);
let [a, b] = arr;
console.log( a + ' ' + b ); // 1.2000000476837158 2.5
Количество элементов массива может не совпадать с количеством переменных внутри квадратных скобок. Кроме того, если элемент не нужен, то достаточно указать переменные только в нужных позициях:
let arr = Float32Array.of(1.2, 2.5, 3.0, 4.1, 5.3);
let a = 0, b = 0;
[a, , b] = arr;
console.log( a + ' ' + b ); // 1.2000000476837158 3
Значения отдельных элементов массива можно сохранить в переменных, а оставшиеся элементы добавить в массив, указав перед ним оператор три точки:
let arr = Float32Array.of(1.2, 2.5, 3.0, 4.1, 5.3);
let [a, b, ...other] = arr;
console.log( a + ' ' + b ); // 1.2000000476837158 2.5
console.log( other );
// [3, 4.099999904632568, 5.300000190734863]
Следует учитывать, что операция присваивания сохраняет в переменной ссылку на массив, а не все его значения. Например, если попробовать сделать так, то изменение arr2
затронет arr1
:
let arr1, arr2;
arr1 = Float32Array.of(1.2, 2.5, 3.0, 4.5);
arr2 = arr1; // Присваивается ссылка на массив!!!
arr2[0] = 88.0;
console.log(arr1); // Float32Array(4) [88, 2.5, 3, 4.5]
console.log(arr2); // Float32Array(4) [88, 2.5, 3, 4.5]
Для создания полной копии можно воспользоваться конструктором класса Float32Array
или статическим методом from()
:
let arr1, arr2;
arr1 = Float32Array.of(1.2, 2.5, 3.0, 4.5);
arr2 = new Float32Array(arr1);
arr2[0] = 88.0;
console.log(arr1); // Float32Array(4) [1.2000000476837158, 2.5, 3, 4.5]
console.log(arr2); // Float32Array(4) [88, 2.5, 3, 4.5]
arr2 = Float32Array.from(arr1);
arr2[0] = 88.0;
console.log(arr1); // Float32Array(4) [1.2000000476837158, 2.5, 3, 4.5]
console.log(arr2); // Float32Array(4) [88, 2.5, 3, 4.5]
Скопировать фрагмент позволяет метод slice([<Начало>[, <Конец>])
. Если параметры не указаны, то создается полная копия. В первом параметре можно указать начальный индекс, а во втором — конечный индекс (не включая элемент с этим индексом). Если второй параметр не задан, то копируется фрагмент, начиная с индекса <Начало>
до конца массива:
let arr1, arr2;
arr1 = Float32Array.of(1.2, 2.5, 3.0, 4.5);
arr2 = arr1.slice();
arr2[0] = 88.0;
console.log(arr1); // Float32Array(4) [1.2000000476837158, 2.5, 3, 4.5]
console.log(arr2); // Float32Array(4) [88, 2.5, 3, 4.5]
arr2 = arr1.slice(2);
console.log(arr2); // Float32Array(2) [3, 4.5]
arr2 = arr1.slice(2, 3);
console.log(arr2); // Float32Array [3]
Для перебора массивов удобно использовать цикл for
. Умножим все элементы массива на 2
:
let arr = Float32Array.of(1.2, 2.5, 3.0);
for (let i = 0; i < arr.length; i++) {
arr[i] *= 2;
}
console.log(arr); // Float32Array(3) [2.4000000953674316, 5, 6]
Перебрать элементы массива позволяет также цикл for...of
, который на каждой итерации присваивает переменной копию значения элемента массива:
let arr = Float32Array.of(1.2, 2.5, 3.0);
for (const value of arr) {
console.log(value);
}
Можно также воспользоваться методом forEach()
. Формат метода:
forEach(<Функция>[, <this>])
В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Значение, указанное в параметре <this>
, будет доступно через указатель this
внутри функции:
let arr = Float32Array.of(1.2, 2.5, 3.0);
arr.forEach( function(value, index, array) {
array[index] = value * 2;
});
console.log(arr); // Float32Array(3) [2.4000000953674316, 5, 6]
Следующие методы возвращают специальный объект — итератор:
keys()
— возвращает итератор, содержащий индексы элементов массива:let arr = Float32Array.of(1.2, 2.5, 3.0, 4.5);
let iterator = arr.keys();
console.log(iterator); // Array Iterator {}
// Перебор всех элементов
for (const key of iterator) {
console.log(`${key} `);
} // 0 1 2 3
// Преобразование в массив
let arrKeys = [...arr.keys()];
console.log(arrKeys); // [0, 1, 2, 3]
values()
— возвращает итератор, содержащий значения элементов массива:let arr = Float32Array.of(5.1, 6.3, 7.5, 8.2);
let iterator = arr.values();
// Перебор всех элементов
for (const value of iterator) {
console.log(value);
} // 5.099999904632568 6.300000190734863 7.5 8.199999809265137
console.log();
// Преобразование в массив
let arrValues = [...arr.values()];
console.log(arrValues);
// [5.099999904632568, 6.300000190734863, 7.5, 8.199999809265137]
arrValues = [...arr];
console.log(arrValues);
// [5.099999904632568, 6.300000190734863, 7.5, 8.199999809265137]
entries()
— возвращает итератор, содержащий пары индекс/значение
всех элементов массива:let arr = Float32Array.of(5.0, 6.5, 7.5);
let iterator = arr.entries();
// Перебор всех элементов
for (const [key, value] of iterator) {
console.log(`${key} => ${value} `);
} // 0 => 5 1 => 6.5 2 => 7.5
// Преобразование в массив
let arrEntries = [...arr.entries()];
console.log(arrEntries); // [ [ 0, 5 ], [ 1, 6.5 ], [ 2, 7.5 ] ]
Метод filter(<Функция>[, <this>])
позволяет выполнить фильтрацию массива. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Функция должна вернуть значение true
, если элемент соответствует условию, и false
— в противном случае. Значение, указанное во втором параметре, будет доступно внутри функции через указатель this
. Метод возвращает массив элементов, соответствующих условию (для которых функция вернула значение true
). Исходный массив не изменяется. Пример:
let arr = Float32Array.of(1.2, 2.5, 3.0, 4.1, 5.6, 6.5);
let arr2 = arr.filter( function(value, index, ar) {
return value < 4;
});
console.log(arr2); // Float32Array(3) [1.2000000476837158, 2.5, 3]
С помощью метода map(<Функция>[, <this>])
можно применить пользовательскую функцию ко всем элементам массива. Внутри функции нужно вернуть новое значение элемента. Метод map()
возвращает отфильтрованный массив. Пример умножения всех элементов массива на 2
:
let arr = Float32Array.of(1.2, 2.5, 3.0, 4.1, 5.6, 6.5);
let arr2 = arr.map( function(value, index, ar) {
return value * 2;
});
console.log(arr2);
// Float32Array(6) [2.4000000953674316, 5, 6, 8.199999809265137,
// 11.199999809265137, 13]
Метод reduce(<Функция>[, <Начальное значение>])
применяет функцию к парам элементов и накапливает результат. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает четыре параметра. Через первый параметр доступен результат предыдущих вычислений или <Начальное значение>
при первом вызове, через второй — значение текущего элемента, через третий — его индекс, а через четвертый — ссылка на массив. Внутри функции нужно вернуть результат текущих вычислений. Метод reduce()
возвращает общий результат вычислений. Пример получения суммы всех элементов массива:
let arr = Float32Array.of(1.2, 2.5, 3.0);
let sum = arr.reduce( function(value1, value2, index, ar) {
return value1 + value2;
}, 0);
console.log(sum); // 6.700000047683716
Метод reduceRight()
аналогичен методу reduce()
, но перебирает элементы не слева направо, а справа налево:
let arr = Float32Array.of(1.2, 2.5, 3.0);
let sum = arr.reduceRight( function(value1, value2, index, ar) {
return value1 + value2;
}, 0);
console.log(sum); // 6.700000047683716
Метод reverse()
переворачивает массив. Элементы будут следовать в обратном порядке относительно исходного массива:
let arr = Float32Array.of(1.2, 2.5, 3.0);
arr.reverse();
console.log(arr); // Float32Array(3) [3, 2.5, 1.2000000476837158]
Метод slice([<Начало>[, <Конец>]])
возвращает срез массива, начиная от индекса <Начало>
и заканчивая индексом <Конец>
, но не включает элемент с этим индексом. Если первый параметр не указан, то он будет иметь значение 0
. Если второй параметр не указан, то возвращаются все элементы до конца массива:
let arr1, arr2;
arr1 = Float32Array.of(1.2, 2.5, 3.0, 4.3);
arr2 = arr1.slice();
arr2[0] = 88.0;
console.log(arr1);
// Float32Array(4) [1.2000000476837158, 2.5, 3, 4.300000190734863]
console.log(arr2);
// Float32Array(4) [88, 2.5, 3, 4.300000190734863]
arr2 = arr1.slice(2);
console.log(arr2); // Float32Array(2) [3, 4.300000190734863]
arr2 = arr1.slice(2, 3);
console.log(arr2); // Float32Array [3]
Вместо метода slice()
можно воспользоваться методом subarray([<Начало>[, <Конец>]])
:
let arr1, arr2;
arr1 = Float32Array.of(1.5, 2.5, 3.0, 4.5);
arr2 = arr1.subarray();
arr2[0] = 88.0;
console.log(arr1); // Float32Array(4) [88, 2.5, 3, 4.5] !!!
console.log(arr2); // Float32Array(4) [88, 2.5, 3, 4.5]
arr2 = arr1.subarray(2);
console.log(arr2); // Float32Array(2) [3, 4.5]
arr2 = arr1.subarray(2, 3);
console.log(arr2); // Float32Array [3]
Метод subarray()
не копируют элементы, а лишь создают ссылку на ту же самую область памяти. Изменение первого массива приведет к изменению второго массива.
Отсортировать массив позволяет метод sort([Функция сортировки])
. Если функция сортировки не указана, будет выполнена обычная сортировка:
let arr = Float32Array.of(4.0, 1.5, 3.0, 2.5);
arr.sort();
console.log(arr); // Float32Array(4) [1.5, 2.5, 3, 4]
Если нужно изменить стандартный порядок сортировки, это можно сделать с помощью пользовательской функции сортировки. Функция принимает две переменные и должна возвращать:
положительное число
— если первый элемент больше второго;отрицательное число
— если второй элемент больше первого;0
— если элементы равны.Отсортируем массив в обратном и прямом порядке:
let arr = Float32Array.of(4.0, 1.5, 3.0, 2.5);
arr.sort( function(a, b) {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
console.log(arr); // Float32Array(4) [4, 3, 2.5, 1.5]
arr.sort((a, b) => a - b);
console.log(arr); // Float32Array(4) [1.5, 2.5, 3, 4]
Выполнить поиск элемента в массиве позволяют следующие методы:
indexOf(<Элемент>[, <Индекс>])
— ищет первое вхождение элемента в массиве. Возвращает индекс найденного элемента или значение -1
, если элемент не найден. Во втором параметре можно указать индекс, с которого начнется поиск. Если второй параметр не указан, то поиск начинается с начала массива:let arr = Float32Array.of(1.1, 2.5, 1.1, 2.5, 3.0);
console.log( arr.indexOf(2.5) ); // 1
console.log( arr.indexOf(2.5, 2) ); // 3
console.log( arr.indexOf(3.0) ); // 4
console.log( arr.indexOf(8.1) ); // -1
lastIndexOf(<Элемент>[, <Индекс>])
— ищет последнее вхождение элемента в массиве:let arr = Float32Array.of(1.1, 2.5, 1.1, 2.5, 3.0);
console.log( arr.lastIndexOf(2.5) ); // 3
console.log( arr.lastIndexOf(2.5, 2) ); // 1
console.log( arr.lastIndexOf(3.0) ); // 4
console.log( arr.lastIndexOf(8.1) ); // -1
includes(<Элемент>[, <Индекс>])
— возвращает значение true
, если элемент присутствует в массиве, и false
— в противном случае. Во втором параметре можно указать индекс элемента с которого начнется поиск. Пример:let arr = Float32Array.of(1.5, 2.3, 3.0);
console.log( arr.includes(1.5) ); // true
console.log( arr.includes(1.5, 1) ); // false
console.log( arr.includes(4.5) ); // false
every(<Функция>[, <this>])
— возвращает значение true
, если все элементы массива соответствуют заданному условию, и false
— в противном случае. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Функция должна вернуть значение true
, если элемент соответствует условию, и false
— в противном случае. Если функция для всех элементов вернула true
, то метод every()
также возвращает значение true
. Если функция вернет значение false
, то проверка прекращается и метод every()
возвращает значение false
. Значение, указанное во втором параметре, будет доступно внутри функции через указатель this
. Пример проверки:function test(value, index, ar) {
return value > 1;
}
let arr = Float32Array.of(2.1, 3.0),
arr2 = Float32Array.of(1.3, 2.5, 0);
console.log( arr.every(test) ); // true
console.log( arr2.every(test) ); // false
some(<Функция>[, <this>])
— возвращает значение true
, если хотя бы один элемент массива соответствует заданному условию, и false
— в противном случае. Если функция вернет значение true
, то проверка прекращается и метод some()
возвращает значение true
. Если функция для всех элементов вернула false
, то метод some()
также возвращает значение false
. Пример:function test(value, index, ar) {
return value < 1;
}
let arr = Float32Array.of(2.1, 3.0),
arr2 = Float32Array.of(1.3, 2.5, 0);
console.log( arr.some(test) ); // false
console.log( arr2.some(test) ); // true
find(<Функция>[, <this>])
— возвращает значение первого элемента, для которого функция вернула true
, или значение undefined
, если функция для всех элементов вернула false
. Пример:function test(value, index, ar) {
return value < 1;
}
let arr = Float32Array.of(2.1, 3.0),
arr2 = Float32Array.of(1.3, 2.5, 0);
console.log( arr.find(test) ); // undefined
console.log( arr2.find(test) ); // 0
findIndex(<Функция>[, <this>])
— возвращает индекс первого элемента, для которого функция вернула true
, или значение -1
, если функция для всех элементов вернула false
. Пример:function test(value, index, ar) {
return value < 1;
}
let arr = Float32Array.of(2.1, 3.0),
arr2 = Float32Array.of(1.3, 2.5, 0);
console.log( arr.findIndex(test) ); // -1
console.log( arr2.findIndex(test) ); // 2
Преобразовать массив в строку позволяют следующие методы:
join([<Разделитель>])
— возвращает строку, полученную в результате объединения всех элементов массива через разделитель:let arr = Float32Array.of(1.5, 2.5, 3.0);
let str = arr.join(' - ');
console.log(str); // 1.5 - 2.5 - 3
Если параметр не указан, то в качестве символа-разделителя будет использоваться запятая:
let arr = Float32Array.of(1.5, 2.5, 3.0);
let str = arr.join();
console.log(str); // 1.5,2.5,3
toString()
— преобразует массив в строку. Элементы перечисляются через запятую без пробела. Метод вызывается автоматически при использовании строкового контекста. Пример:let arr = Float32Array.of(1.5, 2.5, 65535.4);
console.log( arr.toString() ); // 1.5,2.5,65535.3984375
console.log(arr + ''); // 1.5,2.5,65535.3984375
toLocaleString([<Локаль>[, <Опции>]])
— преобразует массив в строку. Элементы указываются через запятую без пробела:let arr = Float32Array.of(1.5, 2.5, 65535.4);
console.log( arr.toLocaleString('en-US') );
// 1.5,2.5,65,535.398
console.log( arr.toLocaleString('ru-RU') );
// 1,5,2,5,65 535,398
Для преобразования типизированного массива в обычный массив можно воспользоваться оператором SPREAD
:
let arr = Float32Array.of(1.5, 2.3, 3.0);
let arr2 = [...arr];
console.log(arr2); // [1.5, 2.299999952316284, 3]