Array
वस्तुऐं क्रम में बढ़ती और सिकुड़ती हैं और उनका कोई भी जावास्क्रिप्ट मूल्य हो सकता है। जावास्क्रिप्ट इंजन अनुकूलन करते रहते हैं ताकि ये सरणियाँ तेज़ हों।हालाँकि, जैसे-जैसे वेब एप्लिकेशनें अधिक से अधिक शक्तिशाली होते जा रही हैं, वैसे-वैसे ऑडियो और वीडियो फाइलों में हेरफेर करने जैसी सुविधाऐं जोड़ना, WebSockets का उपयोग करते हूए कच्चे डेटा तक पहुंचना, इत्यादि हालातों से यह स्पष्ट होता है कि जावास्क्रिप्ट कोड का कच्चे बाइनरी डेटा को जल्दी और आसानी से हेरफेर कर पाना सहायक होगा। यहीं पर टाईप्ड सरणियाँ काम आती हैं। जावास्क्रिप्ट टाईप्ड सरणी में प्रत्येक वस्तु एक कच्चा बाइनरी मान है जो ८-बिट पूर्णांकों से लेकर ६४-बिट फ्लोटिंग-पॉइंट संख्याओं में से एक समर्थित स्वरूपों में है।
हालाँकि, टाईप्ड सरणियों को सामान्य सरणियों के साथ भ्रमित नहीं किया जाना है, क्योंकि टाईप्ड सरणी पर Array.isArray()
कॉल करना false
देता है। इसके अलावा, सामान्य सरणियों के लिए उपलब्ध सभी तरीके (जैसे push
और pop
) टाईप्ड सरणियों द्वारा समर्थित नहीं हैं।
बफ़र और दृश्य: टाईप्ड सरणी वास्तुकला
अधिकतम लचीलापन और दक्षता प्राप्त करने के लिए, जावास्क्रिप्ट टाईप्ड सरणियाँ कार्यान्वयन को बफ़रों और दृश्यों में विभाजित करती है। एक बफ़र (ArrayBuffer
वस्तु द्वारा लागू किया गया) डेटा के एक हिस्सा का प्रतिनिधित्व करने वाली एक वस्तु है; इसका कोई प्रारूप नहीं है और इसकी सामग्री तक पहुँचने के लिए कोई तंत्र नहीं है। एक बफर में निहित स्मृति तक पहुंचने के लिए, आपको एक दृश्य का उपयोग करने की आवश्यकता है। एक दृश्य एक संदर्भ प्रदान करता है - वह है, एक डेटा प्रकार, शुरूआती ऑफ़सेट, और तत्वों की संख्या - जो डेटा को टाईप्ड सरणी में बदल देती है।
ArrayBuffer
ArrayBuffer
एक डेटा प्रकार है जिसका उपयोग सामान्य, निश्चित-आकार बाइनरी डेटा बफर को दर्शाने के लिए किया जाता है। आप सीधे एक ArrayBuffer की सामग्री में हेरफेर नहीं कर सकते हैं; इसके बजाय, आप टाईप्ड सरणी व्यू या एक DataView
बनाते हैं, जो किसी विशिष्ट प्रारूप में बफर का प्रतिनिधित्व करता है, और बफर की सामग्री को पढ़ने और लिखने के लिए इसका उपयोग करते हैं।
टाईप्ड सरणी दृश्य
टाईप्ड सरणी व्यू में स्व-वर्णनात्मक नाम होते हैं और सभी सामान्य संख्यात्मक प्रकार जैसे Int8
, Uint32
, Float64
और इसके आगे के दृश्य प्रदान करते हैं। Uint8ClampedArray
एक विशेष टाईप्ड सरणी व्यू है। यह ० और २५५ के बीच मानों को जकड़ता है। यह कैनवस डेटा प्रसंस्करण के लिए उपयोगी है, उदाहरण के रूप में।
Type | Value Range | Size in bytes | Description | Web IDL type | Equivalent C type |
---|---|---|---|---|---|
Int8Array |
-128 to 127 |
1 | 8-bit two's complement signed integer | byte |
int8_t |
Uint8Array |
0 to 255 |
1 | 8-bit unsigned integer | octet |
uint8_t |
Uint8ClampedArray |
0 to 255 |
1 | 8-bit unsigned integer (clamped) | octet |
uint8_t |
Int16Array |
-32768 to 32767 |
2 | 16-bit two's complement signed integer | short |
int16_t |
Uint16Array |
0 to 65535 |
2 | 16-bit unsigned integer | unsigned short |
uint16_t |
Int32Array |
-2147483648 to 2147483647 |
4 | 32-bit two's complement signed integer | long |
int32_t |
Uint32Array |
0 to 4294967295 |
4 | 32-bit unsigned integer | unsigned long |
uint32_t |
Float32Array |
1.2 ×10-38 to
3.4 ×1038 |
4 | 32-bit IEEE floating point number (7 significant digits e.g.,
1.234567 ) |
unrestricted float |
float |
Float64Array |
5.0 ×10-324 to
1.8 ×10308 |
8 | 64-bit IEEE floating point number (16 significant digits e.g.,
1.23456789012345 ) |
unrestricted double |
double |
BigInt64Array |
-263 to 263-1 |
8 | 64-bit two's complement signed integer | bigint |
int64_t (signed long long) |
BigUint64Array |
0 to 264-1 |
8 | 64-bit unsigned integer | bigint |
uint64_t (unsigned long long) |
DataView
DataView
एक निम्न-स्तरीय अंतराफलक है जो बफर को मनमाना डेटा पढ़ने और लिखने के लिए एक getter/setter API प्रदान करता है। उदाहरण के लिए, विभिन्न प्रकार के डेटा से निपटने के दौरान यह उपयोगी है। टाईप्ड सरणी व्यू आपके मंच के मूल बाइट-क्रम (Endianness) देखें। DataView
के साथ आप बाइट-क्रम को नियंत्रित करने में सक्षम हैं। यह डिफ़ॉल्ट रूप से big-endian है और getter/setter विधियों से little-endian पर सेट किया जा सकता है।
टाईप्ड सरणी का उपयोग करने वाले Web APIs
ये Web APIs के कुछ उदाहरण हैं जो टाईप्ड सरणियों का उपयोग करते हैं; अन्य और भी हैं, और हर समय अधिक जोड़े जा रहे हैं।
FileReader.prototype.readAsArrayBuffer()
- The
FileReader.prototype.readAsArrayBuffer()
विधि निर्दिष्टBlob
याFile
की सामग्री को पढ़ना शुरू करती है. XMLHttpRequest.prototype.send()
XMLHttpRequest
वस्तु कीsend()
विधि अब टाईप्ड सरणियों औरArrayBuffer
वस्तुओं को तर्क के रूप में समर्थन करती है।ImageData.data
Uint8ClampedArray
RGBA क्रम में डेटा युक्त एक आयामी सरणी का प्रतिनिधित्व करती है, जिसमें०
और२५५
समावेशी के बीच पूर्णांक मान होते हैं।
उदाहरण
बफ़रों के साथ दृश्यों का उपयोग करना
सबसे पहले, हमें १६-बाइटों के निश्चित-आकार की एक बफर बनाने की आवश्यकता होगी:
let buffer = new ArrayBuffer(16);
इस क्षण पर, हमारे पास स्मृति का एक हिस्सा है जिसकी सभी बाइट्स पहले से ० हैं। हालांकि, बहुत कुछ ऐसा नहीं है जिसे हम इसके साथ कर सकते हैं। हम पुष्टि कर सकते हैं कि यह वास्तव में १६ बाइट लंबा है, और इसके बारे में है:
if (buffer.byteLength === 16) {
console.log("Yes, it's 16 bytes.");
} else {
console.log("Oh no, it's the wrong size!");
}
इससे पहले कि हम वास्तव में इस बफर के साथ काम कर सकें, हमें एक दृश्य बनाने की आवश्यकता है। आइए एक दृश्य बनाते हैं जो बफर में डेटा को ३२-बिट हस्ताक्षरित पूर्णांक की एक सरणी के रूप में देखता है:
let int32View = new Int32Array(buffer);
अब हम सामान्य सरणी की तरह ही सरणी में तत्वों तक पहुँच सकते हैं:
for (let i = 0; i < int32View.length; i++) {
int32View[i] = i * 2;
}
यह ०, २, ४ और ६ मानों के साथ सरणी में ४ तत्वों को भरता है (प्रत्येक ४ बाइट में ४ तत्व कुल १६ बाइट बनाते है)।
एक ही डेटा पर कई दृश्य
चीजें वास्तव में दिलचस्प होने लगती हैं जब आप विचार करते हैं कि आप एक ही डेटा पर कई दृश्य बना सकते हैं। उदाहरण के लिए, ऊपर दिया गया कोड, हम इस तरह जारी रख सकते हैं:
let int16View = new Int16Array(buffer);
for (let i = 0; i < int16View.length; i++) {
console.log('Entry ' + i + ': ' + int16View[i]);
}
यहां हम एक १६-बिट पूर्णांक दृश्य बनाते हैं जो मौजूदा ३२-बिट दृश्य के समान बफर को साझा करता है और हम बफर में सभी मानों को १६-बिट पूर्णांक के रूप में आउटपुट करते हैं। अब हम आउटपुट ०, ०, २, ०, ४, ०, ६, ० प्राप्त करते हैं।
आप एक कदम आगे जा सकते हैं, यद्यपि। इस पर विचार करो:
int16View[0] = 32;
console.log('Entry 0 in the 32-bit array is now ' + int32View[0]);
इससे आउटपुट "Entry 0 in the 32-bit array is now 32" आता है। दूसरे शब्दों में, दो सरणियों को सरलता से एक ही डेटा बफर पर देखा जाता है, इसे विभिन्न स्वरूप समझकर। आप यह किसी भी प्रकार के दृश्य के साथ कर सकते हैं।
जटिल डेटा संरचनाओं के साथ काम करना
एकल बफर को विभिन्न प्रकारों के कई दृश्यों के साथ जोड़कर, बफर में अलग-अलग ऑफसेटों पर शुरू करके, आप डेटा वस्तुओं में कई डेटा प्रकारों के साथ खेल सकते हैं। यह आपको, उदाहरण के लिए, WebGL से जटिल डेटा संरचनाओं, डेटा फ़ाइलों, या C संरचनाओं का उपयोग करते समय आपको जो js-ctypes का उपयोग करने की आवश्यकता होती है, उनके साथ खेलना देता है।
इस C संरचना पर विचार करें:
struct someStruct {
unsigned long id;
char username[16];
float amountDue;
};
आप इस तरह से इस प्रारूप में डेटा युक्त एक बफर का उपयोग कर सकते हैं:
let buffer = new ArrayBuffer(24);
// ... read the data into the buffer ...
let idView = new Uint32Array(buffer, 0, 1);
let usernameView = new Uint8Array(buffer, 4, 16);
let amountDueView = new Float32Array(buffer, 20, 1);
फिर आप उपयोग कर सकते हैं, उदाहरण के लिए, amountDueView[0]
के कारण राशि।
सामान्य सरणियों में रूपांतरण
निश्चित-आकार सरणी को संसाधित करने के बाद, Array
प्रोटोटाइप से लाभ उठाने के लिए इसे सामान्य सरणी में परिवर्तित करना कभी-कभी उपयोगी होता है। यह Array.from
, या निम्न कोड का उपयोग करके किया जा सकता है जहाँ Array.from
असमर्थित है।
let typedArray = new Uint8Array([1, 2, 3, 4]),
normalArray = Array.prototype.slice.call(typedArray);
normalArray.length === 4;
normalArray.constructor === Array;
विशेष विवरण
विशेष विवरण | स्थिति | टिप्पणी |
---|---|---|
Typed Array Specification | Obsolete | ईसीएमएस्क्रिप्ट २०१५ द्वारा अभिहित। |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'TypedArray Objects' in that specification. |
Standard | ECMA मानक में प्रारंभिक परिभाषा। |
ECMAScript (ECMA-262) The definition of 'TypedArray Objects' in that specification. |
Living Standard |
ब्राउज़र संगतता
BCD tables only load in the browser