Nah, ini sebenarnya objek, misalnya, kita dapat membuat array seperti ini:
var array = array baru (10);
Kekuatan dan kemahakuasaan dari array JavaScript memberi kita kenyamanan. Tetapi secara umum:
Hal-hal serba dapat digunakan di berbagai lingkungan, tetapi mereka tidak selalu cocok untuk berbagai lingkungan.
TypedArray justru apa yang terjadi untuk menyelesaikan masalah bahwa array melakukan terlalu banyak hal dalam JavaScript.
asalTypedArray adalah tipe buffer panjang tetap yang umum yang memungkinkan pembacaan data biner dalam buffer.
Diperkenalkan dalam spesifikasi WebGL untuk menyelesaikan masalah data biner pemrosesan JavaScript.
TypedArray telah didukung oleh sebagian besar browser modern. Misalnya, Anda dapat membuat typedArray menggunakan metode berikut:
// Buat arraybuffer 8-byte
var b = arraybuffer baru (8);
// Buat referensi B, ketik int32, posisi awal adalah 0, dan posisi akhir adalah akhir dari buffer
var v1 = int32Array baru (b);
// Buat referensi B, jenisnya adalah UInt8, posisi awal adalah 2, dan posisi akhir adalah akhir dari buffer
var V2 = UTT8Array baru (b, 2);
// Buat referensi b, ketik int16, posisi awal adalah 2, dan panjang totalnya adalah 2
var v3 = int16Array baru (b, 2, 2);
Tata letak referensi yang buffered dan dibuat adalah:
| variabel | indeks | |||||||
|---|---|---|---|---|---|---|---|---|
| Jumlah byte | ||||||||
| b = | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Jumlah indeks | ||||||||
| v1 = | 0 | 1 | ||||||
| v2 = | 0 | 1 | 2 | 3 | 4 | 5 | ||
| v3 = | 0 | 1 | ||||||
Ini berarti bahwa elemen 0 dari array V1 tipe int32 adalah 0-3 byte tipe arraybuffer, dan sebagainya.
KonstruktorDi atas kami membuat TypedArray melalui ArrayBuffer, dan pada kenyataannya, TypedArray menyediakan 3 konstruktor untuk membuat contohnya.
TypedArray (tidak ditandatangani panjang)
Buat typedArray baru dengan panjang menjadi panjang tetapnya.
TypedArray (TypedArray Array)
TypedArray (type [] array)
Buat typedArray baru, setiap elemen diinisialisasi sesuai dengan array, dan elemen dikonversi sesuai.
TypedArray (Buffer ArrayBuffer, Opsional Unsigned Long Byteoffset, Opsional Unsigned Long)
Buat typedArray baru sebagai referensi ke buffer, byteOffset sebagai start offset dan panjangnya sebagai panjangnya.
Jadi kami biasanya membuat typedArray dengan cara berikut:
var array = uint8Array baru (10);
atau:
var array = Uint8Array baru ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
Operasi DataTypedArray menyediakan empat metode: Setter, Getter, Set, dan Subarray untuk operasi data.
Mengembalikan elemen dari indeks yang ditentukan.
Setter void set (indeks panjang unsigned, nilai tipe )Menetapkan elemen dari indeks yang ditentukan ke nilai yang ditentukan.
set void ( TypedArray Array, Optional Unsigned Long Offset) Void Set ( Type [] Array, Opsional Unsigned Long Offset)Atur nilai sesuai dengan array, offset adalah posisi offset.
TypedArray Subarray (Long Begin, Opsional Long End)Mengembalikan TypedArray baru dengan bit awal dimulai dan akhir bit akhir.
Misalnya, elemen bacaan dapat digunakan : var array = uint8Array baru ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); peringatan (array [4]); // 5 Pengaturan elemen dapat digunakan : var array = uint8Array baru ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); peringatan (array [4]); // 5Array [4] = 12; peringatan (array [4]); // 12 Dapatkan salinan dan Anda dapat menggunakan : var array = uint8Array baru ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); var array2 = array.subarray (0); jenis array| jenis | ukuran | menggambarkan | Jenis IDL Web | Tipe c |
|---|---|---|---|---|
Int8Array | 1 | Integer yang ditandatangani 8-bit | byte | signed char |
Uint8Array | 1 | Integer unsigned 8-bit | octet | unsigned char |
Uint8ClampedArray | 1 | 8-bit Unsigned Integer (dijepit) | octet | unsigned char |
Int16Array | 2 | Integer ditandatangani 16-bit | short | short |
Uint16Array | 2 | Integer unsigned 16-bit | unsigned short | unsigned short |
Int32Array | 4 | Integer ditandatangani 32-bit | long | int |
Uint32Array | 4 | Integer unsigned 32-bit | unsigned long | unsigned int |
Float32Array | 4 | Nomor Titik Mengambang IEEE 32-bit | unrestricted float | float |
Float64Array | 8 | 64-bit IEEE Floating Point Number | unrestricted double | double |
Mereka yang telah memainkan kanvas mungkin merasa akrab.
Karena array yang digunakan dalam Imagedata untuk menyimpan data gambar adalah tipe uint8clampedArray.
Misalnya:
var context = document.createElement (canvas) .getContext (2d); var imagedata = context.createMagedata (100, 100); console.log (imagedata.data); Itu ditampilkan di firebug sebagai :Mengapa menggunakan TypedArrayUint8clampedArray {0 = 0, 1 = 0, 2 = 0, lebih ...}
Kita tahu bahwa angka-angka dalam JavaScript adalah angka floating point 64-bit. Untuk gambar biner (setiap piksel disimpan sebagai integer 8-bit unsigned), jika Anda ingin menggunakan datanya dalam array JavaScript, itu setara dengan menggunakan 8 kali memori gambar untuk menyimpan data gambar, yang jelas tidak ilmiah. TypedArray dapat membantu kami hanya menggunakan 1/8 dari memori asli untuk menyimpan data gambar.
Atau untuk Websocket, ini juga cara yang lebih mahal untuk mentransfer dengan Base64, dan beralih ke transfer biner mungkin merupakan cara yang lebih baik.
Tentu saja, TypedArray memiliki lebih banyak manfaat, seperti memiliki kinerja yang lebih baik. Mari kita lakukan beberapa tes kecil untuk memverifikasi ini.
Browser yang berpartisipasi dalam tes adalah :Test1: membaca kecepatan bacaan berurutanFirefox 17.0.1 dan Chrome 23.0.1271.97m
var timearray1 = [];
var timearray2 = [];
function check1 () {
var array = uint8clampedArray baru (5000000);
untuk (var i = array.length; i-;) {
array [i] = math.floor (math.random () * 100);
}
var temp;
var time1 = (tanggal baru ()). getTime ();
untuk (var i = array.length; i-;) {
temp = array [i];
}
var time2 = (new date ()). getTime ();
Console.log (Time2 - Time1);
timearray1.push (time2 - time1);
}
function check2 () {
var array2 = array baru (5000000);
untuk (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var temp;
var time3 = (tanggal baru ()). getTime ();
untuk (var i = array2.length; i-;) {
temp = array2 [i];
}
var time4 = (new date ()). getTime ();
Console.log (Time4 - Time3);
timearray2.push (time4 - time3);
}
function timer (__ fun, __time, __callback) {
var sekarang = 0;
fungsi begin () {
var timeout = setTimeout (function () {
if (now! == __time) {
sekarang ++;
__seru();
mulai();
}kalau tidak{
if (timearray1.length && timearray2.length) {
console.log ("TimeArray1 ==" + TimeArray1 + ", rata -rata ==" + rata -rata (TimeArray1));
console.log ("TimeArray2 ==" + TimeArray2 + ", rata -rata ==" + rata -rata (TimeArray2));
}
__callback && __callback ();
}
}, 100);
}
mulai();
}
fungsi rata -rata (__ array) {
var total = 0;
untuk (var i = __array.length; i-;) {
Total += __Array [i];
}
return (total / __array.length);
}
timer (check1, 10, function () {
timer (check2, 10);
});
Dapat dilihat bahwa kecepatan baca UInt8clampedArray secara signifikan lebih cepat daripada array (semakin lama bilah, semakin banyak waktu yang dibutuhkan).
Test2: baca acak//…
function check1 () {
var array = uint8clampedArray baru (5000000);
untuk (var i = array.length; i-;) {
array [i] = math.floor (math.random () * 100);
}
var temp;
var time1 = (tanggal baru ()). getTime ();
untuk (var i = array.length; i-;) {
temp = array [math.floor (math.random () * 5000000)];
}
var time2 = (new date ()). getTime ();
Console.log (Time2 - Time1);
timearray1.push (time2 - time1);
}
function check2 () {
var array2 = array baru (5000000);
untuk (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var temp;
var time3 = (tanggal baru ()). getTime ();
untuk (var i = array2.length; i-;) {
temp = array2 [math.floor (math.random () * 5000000)];
}
var time4 = (new date ()). getTime ();
Console.log (Time4 - Time3);
timearray2.push (time4 - time3);
}
//…
UInt8ClampedArray membaca lebih cepat dari array.
Test3: Penulisan berurutan//…
function check1 () {
var array = uint8clampedArray baru (5000000);
var time1 = (tanggal baru ()). getTime ();
untuk (var i = array.length; i-;) {
array [i] = math.floor (math.random () * 100);
}
var time2 = (new date ()). getTime ();
Console.log (Time2 - Time1);
timearray1.push (time2 - time1);
}
function check2 () {
var array2 = array baru (5000000);
var time3 = (tanggal baru ()). getTime ();
untuk (var i = array2.length; i-;) {
array2 [i] = math.floor (math.random () * 100);
}
var time4 = (new date ()). getTime ();
Console.log (Time4 - Time3);
timearray2.push (time4 - time3);
}
//…
Test4: Operasi Salin (U8C ke U8C dan Array ke U8C)//…
function check1 () {
var array = uint8clampedArray baru (5000000);
untuk (var i = array.length; i-;) {
array [i] = math.floor (math.random () * 100);
}
var temp;
var array2 = uint8clampedArray baru (5000000);
var time1 = (tanggal baru ()). getTime ();
array2.set (array);
var time2 = (new date ()). getTime ();
Console.log (Time2 - Time1);
timearray2.push (time2 - time1);
}
function check2 () {
var array = array baru (5000000);
untuk (var i = array.length; i-;) {
array [i] = math.floor (math.random () * 100);
}
var temp;
var array2 = uint8clampedArray baru (5000000);
var time1 = (tanggal baru ()). getTime ();
array2.set (array);
var time2 = (new date ()). getTime ();
Console.log (Time2 - Time1);
timearray2.push (time2 - time1);
}
//…
Dapat dilihat bahwa menyalin U8C ke U8C jauh lebih cepat daripada menyalin array ke U8C.