TypedArray ב-JavaScript
מאמר זה מסביר את השימוש ב-TypedArray
ב-JavaScript.
נסביר בפירוט את הקונספט הבסיסי של TypedArray
, כל סוג, כיצד להשתמש בהם ומקרי שימוש ספציפיים.
YouTube Video
TypedArray ב-JavaScript
TypedArray
ב-JavaScript הוא אובייקט לניהול יעיל של נתונים בינאריים שמורים בזיכרון. TypedArray
מקצה ומעבד זיכרון בהתבסס על סוגי נתונים מסוימים. בניגוד למערכים רגילים, TypedArray
יכול להכיל רק נתונים בינאריים בגודל קבוע ולא סוגי נתונים אקראיים.
המבנה הבסיסי של TypedArray
המרכיבים העיקריים של TypedArray
הם ArrayBuffer
ו-TypedArray
עצמו.
- ArrayBuffer: מאגר (buffer) בגודל קבוע שמקצה נתונים בינאריים בזיכרון. מאגר זה הוא אזור נתונים בלבד ואינו נגיש לקריאה או כתיבה ישירה.
- TypedArray: אובייקט עטיפה שמחיל סוג נתונים ספציפי על המאגר, ומאפשר גישה ועיבוד נתונים.
דוגמה בסיסית לשימוש
להלן דוגמה ליצירת ArrayBuffer
ולאחר מכן יצירת TypedArray
המבוסס עליו.
1// Create a 16-byte buffer
2const buffer = new ArrayBuffer(16);
3
4// Create a TypedArray (Uint8Array) to handle 8-bit unsigned integers
5const uint8Array = new Uint8Array(buffer);
6
7// Set data
8uint8Array[0] = 255;
9uint8Array[1] = 128;
10
11// Retrieve data
12console.log(uint8Array[0]); // 255
13console.log(uint8Array[1]); // 128
- בדוגמה זו, נוצר
ArrayBuffer
ולאחר מכן נוצרUint8Array
המבוסס על המאגר הזה. כל אלמנט מזוהה כשלם ללא סימן בגודל 8 ביט, המאחסן ערכים רק בטווח שצוין.
סוגי TypedArray
ישנם סוגים שונים של TypedArray
עבור כל סוג מידע. העיקריים שבהם הם כדלקמן.
שם הסוג | גודל אלמנט | תיאור |
---|---|---|
Int8Array |
1 בתים | שלם חתום בגודל 8 סיביות |
Uint8Array |
1 בתים | שלם לא חתום בגודל 8 סיביות |
Uint8ClampedArray |
1 בתים | שלם לא חתום בגודל 8 סיביות (מחזיק ערכים מוגבלים) |
Int16Array |
2 בתים | שלם חתום בגודל 16 סיביות |
Uint16Array |
2 בתים | שלם לא חתום בגודל 16 סיביות |
Int32Array |
4 בתים | שלם חתום בגודל 32 סיביות |
Uint32Array |
4 בתים | שלם לא חתום בגודל 32 סיביות |
Float32Array |
4 בתים | מספר נקודה צפה בגודל 32 סיביות |
Float64Array |
8 בתים | מספר נקודה צפה בגודל 64 סיביות |
מופעי ה-TypedArray
האלו הם חסכוניים בזיכרון ויעילים לטיפול בכמויות גדולות של נתונים.
טיפול במופעי TypedArray
ניתן לגשת לנתונים בתוך TypedArray
באמצעות אינדקסים, בדומה למערך רגיל, אך קיימות גם מספר שיטות מיוחדות.
הגדרת ערכים
ב-TypedArray
ניתן להקצות מספר ערכים בו זמנית בעזרת השיטה set
.
1const buffer = new ArrayBuffer(8);
2const int16Array = new Int16Array(buffer);
3
4// Set values
5int16Array.set([10, 20, 30]);
6
7console.log(int16Array[0]); // 10
8console.log(int16Array[1]); // 20
9console.log(int16Array[2]); // 30
- הקוד הזה משתמש בשיטה
set
כדי להקצות ערכים מרובים בבת אחת ל-Int16Array
, ומציג כל איבר במסוף.
קבלת תת-מערך
כדי לקבל חלק ממופע ה-TypedArray
כתת-מערך, השתמשו בשיטה subarray
. תת-מערך זה מתייחס לאותו ה-buffer של מופע ה-TypedArray
המקורי.
1const int16Array = new Int16Array([1, 2, 3, 4, 5]);
2
3// Get a subarray containing elements from the 2nd to the 4th
4const subArray = int16Array.subarray(1, 4);
5
6console.log(subArray); // Int16Array [2, 3, 4]
- הקוד הזה מאחזר טווח מסוים של איברים מתוך
Int16Array
באמצעות השיטהsubarray
ומציג את תת-המערך במסוף.
העתקת buffers
ניתן להעתיק את ה-buffer של מופע TypedArray
אחד למופע TypedArray
אחר. באמצעות השיטה set
, ניתן להעתיק מעמדה מסוימת.
1const srcArray = new Uint8Array([10, 20, 30, 40]);
2const destArray = new Uint8Array(4);
3
4// Copy
5destArray.set(srcArray);
6
7console.log(destArray); // Uint8Array [10, 20, 30, 40]
- הקוד הזה מעתיק את התוכן של
Uint8Array
למערך אחר באמצעות השיטהset
, ומציג את המערך המועתק במסוף.
שימוש ב-DataView
בעוד ש-TypedArray
מטפל ב-buffers עם סוג נתונים קבוע, DataView
הוא ממשק שמאפשר טיפול גמיש בנתונים בינאריים עם מיקומים וסוגי נתונים משתנים. כך ניתן לערבב סוגי נתונים שונים בתוך אותו buffer.
1const buffer = new ArrayBuffer(8);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer at offset 0
5dataView.setInt32(0, 12345);
6
7// Write a 32-bit floating-point number at offset 4
8dataView.setFloat32(4, 12.34);
9
10console.log(dataView.getInt32(0)); // 12345
11console.log(dataView.getFloat32(4)); // 12.34000015258789
-
הקוד הזה משתמש ב-
DataView
כדי לכתוב סוגי נתונים שונים—מספרים שלמים בגודל 32 ביט ומספרים עשרוניים צפים בגודל 32 ביט—על אותו buffer ובודק את התוצאות. -
ל-
DataView
יש גמישות גבוהה יותר לגישה לנתונים מאשר ל-TypedArray
, והוא שימושי במיוחד כשעובדים עם קבצים בפורמט בינארי או פרוטוקולי רשת.
שימושים אפשריים ב-TypedArray
מופעי TypedArray
משמשים בעיקר לטיפול יעיל בכמויות גדולות של נתונים בינאריים. שימושים ספציפיים כוללים את הבאים.
עיבוד תמונה
מופעי TypedArray
משמשים כאשר מבצעים מניפולציות על מידע פיקסלים של נתוני תמונה. באמצעות Uint8Array
, ניתן לאחסן את ערכי ה-RGBA של כל פיקסל ולבצע עריכת תמונה ועיבוד.
1const width = 100;
2const height = 100;
3const imageData = new Uint8Array(width * height * 4); // RGBA
4
5// Set pixel data
6for (let i = 0; i < imageData.length; i += 4) {
7 imageData[i] = 255; // Red
8 imageData[i + 1] = 0; // Green
9 imageData[i + 2] = 0; // Blue
10 imageData[i + 3] = 255; // Alpha
11}
- הקוד הזה יוצר נתוני תמונה ברוחב של 100 ובגובה של 100 בפורמט RGBA באמצעות
Uint8Array
, ומגדיר את כל הפיקסלים לאדום.
אינטגרציה עם WebAssembly
TypedArray
משמש להחלפת נתונים בינאריים בין JavaScript ו-WebAssembly. על ידי שיתוף אזור הזיכרון של JavaScript ו-WebAssembly באמצעות ArrayBuffer
, ניתן לבצע החלפת נתונים מהירה.
עיבוד נתוני אודיו ווידאו
TypedArray
ממלא תפקיד חשוב בעיבוד אודיו ווידאו. ניתן לאחסן גלי נתוני אודיו ב-Float32Array
לצורך השמעה ועיבוד.
סיום
TypedArray
הוא כלי עוצמתי לטיפול יעיל בכמויות גדולות של נתונים בינאריים. הוא שימושי במיוחד ביישומים קריטיים לביצועים כמו עיבוד תמונה, WebAssembly ועיבוד נתוני אודיו/וידאו. TypedArray
כולל API שדומה למערכים רגילים, אך ישנם מגבלות לגבי שימוש בזיכרון וסוגי נתונים, ולכן נדרשת הבחנה נכונה בשימוש.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.