Ну, это на самом деле объект, например, мы можем создать такой массив, как это:
var array = new Array (10);
Мощность и всемогущество массивов JavaScript приносят нам работу. Но вообще говоря:
Все кругосветные вещи могут использоваться в различных средах, но они не обязательно подходят для различных сред.
TypedArray - это именно то, что случилось, чтобы решить проблему, что массивы делают слишком много вещей в JavaScript.
источникTypedArray-это общий тип буфера с фиксированной длиной, который позволяет считывать бинарные данные в буфере.
Он введен в спецификации WebGL, чтобы решить проблему бинарных данных обработки JavaScript.
TypedArray был поддержан большинством современных браузеров. Например, вы можете создать TypedArray, используя следующий метод:
// Создать 8-байтовый ArrayBuffer
var b = new ArrayBuffer (8);
// Создать ссылку на B, тип Int32, начальная позиция равен 0, а конечная позиция - конец буфера
var v1 = new Int32Array (b);
// Создать ссылку на B, тип uint8, исходная позиция 2, а конечная позиция - конец буфера
var v2 = new uint8array (b, 2);
// Создать ссылку на B, тип Int16, начальная позиция составляет 2, а общая длина - 2
var v3 = new Int16Array (B, 2, 2);
Буференный и созданный эталонный макет:
| переменная | индекс | |||||||
|---|---|---|---|---|---|---|---|---|
| Количество байтов | ||||||||
| b = | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Количество индексов | ||||||||
| v1 = | 0 | 1 | ||||||
| v2 = | 0 | 1 | 2 | 3 | 4 | 5 | ||
| v3 = | 0 | 1 | ||||||
Это означает, что 0-й элемент массива V1 типа INT32-0-3 байта типа ArrayBuffer и так далее.
КонструкторВыше мы создаем TypedArray через ArrayBuffer, и на самом деле TypedArray предоставляет 3 конструктора для создания своего экземпляра.
Typedarray (без знака длинной длины)
Создайте новый TypedArray с длиной - его фиксированная длина.
TypedArray (массив Typedarray)
Typedarray (тип [] массив)
Создайте новый TypedArray, каждый элемент инициализируется в соответствии с массивом, и элемент преобразуется соответственно.
TypedArray (буфер ArrayBuffer, необязательный без знака Long ByteOffSet, дополнительная длинная длина без знака)
Создайте новый TypedArray в качестве ссылки на буфер, Byteoffset в качестве исходного смещения и длины как его длины.
Таким образом, мы обычно создаем TypedArray следующим образом:
var array = new Uint8Array (10);
или:
var array = new Uint8Array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
Операция данныхTypedArray предоставляет четыре метода: Setter, Getter, Set и Subarray для операций данных.
Возвращает элемент указанного индекса.
Setter void set (Unsigned Long Index, значение типа )Устанавливает элемент указанного индекса на указанное значение.
void set ( массив TypedArray , необязательное без знакаУстановите значение в соответствии с массивом, Offset является позицией смещения.
TypedArray Subarray (Long Begin, дополнительная длинная конец)Возвращает новый TypedArray с началом начала и конец конец.
Например, можно использовать элементы чтения : var array = new uint8array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); оповещение (массив [4]); // 5 Настройки могут быть использованы элементы : var array = new uint8array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); оповещение (массив [4]); // 5Array [4] = 12; оповещение (массив [4]); // 12 Получите копию, и вы можете использовать : var array = new uint8array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); var array2 = array.subarray (0); тип массива| тип | размер | описывать | Веб -тип IDL | Тип c |
|---|---|---|---|---|
Int8Array | 1 | 8-битное подписанное целое число | byte | signed char |
Uint8Array | 1 | 8-битное целое число без знака | octet | unsigned char |
Uint8ClampedArray | 1 | 8-битное без знака целочисленного (зажатое) | octet | unsigned char |
Int16Array | 2 | 16-битное подписанное целое число | short | short |
Uint16Array | 2 | 16-битное нежелательное целое число | unsigned short | unsigned short |
Int32Array | 4 | 32-битное подписанное целое число | long | int |
Uint32Array | 4 | 32-битное целое число без знака | unsigned long | unsigned int |
Float32Array | 4 | 32-битный номер плавающей запятой IEEE | unrestricted float | float |
Float64Array | 8 | 64-битный номер плавающей запятой IEEE | unrestricted double | double |
Те, кто играл в холст, могут чувствовать себя знакомыми.
Потому что массив, используемый в Imagedata для хранения данных изображения, имеет тип Uint8clampedArray.
Например:
var context = document.createElement (canvas) .getContext (2d); var ImageData = context.createImagedata (100, 100); console.log (imagenata.data); Он отображается в Firebug как :Зачем использовать TypedArrayUint8clampedarray {0 = 0, 1 = 0, 2 = 0, больше ...}
Мы знаем, что цифры в JavaScript-это 64-битные номера плавания. Для двоичного изображения (каждый пиксель хранится как 8-битное целое число без знака), если вы хотите использовать его данные в массиве JavaScript, оно эквивалентно использованию в 8 раз больше изображения для хранения данных изображения, что, очевидно, является неудовлетворительным. TypedArray может помочь нам использовать только 1/8 исходной памяти для хранения данных изображения.
Или для WebSocket, это также более дорогой способ перевода с Base64, и переход на бинарную передачу может быть лучшим способом.
Конечно, TypedArray имеет больше преимуществ, таких как лучшая производительность. Давайте сделаем несколько небольших тестов, чтобы проверить это.
Браузеры, участвующие в тесте :Test1: последовательное чтение скорости чтенияFirefox 17.0.1 и Chrome 23.0.1271.97m
var rimeArray1 = [];
var rimeArray2 = [];
функция проверка1 () {
var array = new Uint8clampedArray (5000000);
for (var i = array.length; i-;) {
Array [i] = math.floor (math.random () * 100);
}
var temp;
var time1 = (new Date ()). getTime ();
for (var i = array.length; i-;) {
temp = array [i];
}
var time2 = (new Date ()). getTime ();
console.log (Time2 - Time1);
rimearray1.push (Time2 - Time1);
}
функция проверка2 () {
var array2 = новый массив (5000000);
for (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var temp;
var time3 = (new Date ()). getTime ();
for (var i = array2.length; i-;) {
temp = array2 [i];
}
var time4 = (new Date ()). getTime ();
console.log (Time4 - Time3);
rimearray2.push (Time4 - Time3);
}
Таймер функции (__ веселье, __time, __callback) {
var теперь = 0;
функция begin () {
var timeout = setTimeout (function () {
if (сейчас! == __time) {
Теперь ++;
__веселье();
начинать();
}еще{
if (rimearray1.length && timearray2.length) {
console.log ("timearray1 ==" + timeArray1 + ", среднее ==" + среднее (timearray1));
console.log ("timearray2 ==" + timearray2 + ", среднее ==" + среднее (timearray2));
}
__callback && __callback ();
}
}, 100);
}
начинать();
}
Функция среднего (__ массив) {
var total = 0;
for (var i = __array.length; i-;) {
Всего += __array [i];
}
return (total / __array.length);
}
таймер (Check1, 10, function () {
таймер (Check2, 10);
});
Видно, что скорость чтения Uint8clampedArray значительно быстрее, чем у массива (чем дольше батончик, тем больше времени он требует).
Test2: случайное чтение//…
функция проверка1 () {
var array = new Uint8clampedArray (5000000);
for (var i = array.length; i-;) {
Array [i] = math.floor (math.random () * 100);
}
var temp;
var time1 = (new Date ()). getTime ();
for (var i = array.length; i-;) {
temp = array [math.floor (math.random () * 5000000)];
}
var time2 = (new Date ()). getTime ();
console.log (Time2 - Time1);
rimearray1.push (Time2 - Time1);
}
функция проверка2 () {
var array2 = новый массив (5000000);
for (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var temp;
var time3 = (new Date ()). getTime ();
for (var i = array2.length; i-;) {
temp = array2 [math.floor (math.random () * 5000000)];
}
var time4 = (new Date ()). getTime ();
console.log (Time4 - Time3);
rimearray2.push (Time4 - Time3);
}
//…
Uint8clampedArray читается быстрее, чем массив.
Тест3: последовательное письмо//…
функция проверка1 () {
var array = new Uint8clampedArray (5000000);
var time1 = (new Date ()). getTime ();
for (var i = array.length; i-;) {
Array [i] = math.floor (math.random () * 100);
}
var time2 = (new Date ()). getTime ();
console.log (Time2 - Time1);
rimearray1.push (Time2 - Time1);
}
функция проверка2 () {
var array2 = новый массив (5000000);
var time3 = (new Date ()). getTime ();
for (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var time4 = (new Date ()). getTime ();
console.log (Time4 - Time3);
rimearray2.push (Time4 - Time3);
}
//…
Test4: Операция копирования (U8C до U8C и массив до U8C)//…
функция проверка1 () {
var array = new Uint8clampedArray (5000000);
for (var i = array.length; i-;) {
Array [i] = math.floor (math.random () * 100);
}
var temp;
var array2 = new uint8clampedarray (5000000);
var time1 = (new Date ()). getTime ();
array2.set (массив);
var time2 = (new Date ()). getTime ();
console.log (Time2 - Time1);
rimearray2.push (Time2 - Time1);
}
функция проверка2 () {
var Array = новый массив (5000000);
for (var i = array.length; i-;) {
Array [i] = math.floor (math.random () * 100);
}
var temp;
var array2 = new uint8clampedarray (5000000);
var time1 = (new Date ()). getTime ();
array2.set (массив);
var time2 = (new Date ()). getTime ();
console.log (Time2 - Time1);
rimearray2.push (Time2 - Time1);
}
//…
Видно, что копирование U8C в U8C намного быстрее, чем массив, копирование в U8C.