Array.from
पहले तर्क के पुनरावृत्ति को आमंत्रित करने की कोशिश करता है अगर यह एक है, और तार में पुनरावृत्तियां हैं, तो यह आह्वान करता है String.prototype[Symbol.iterator]
, तो आइए देखें कि प्रोटोटाइप विधि कैसे काम करती है। यह यहाँ विनिर्देशन में वर्णित है :
- ओ हो? NeedObjectCoercible (यह मान)।
- रहने दो ? ToString (ओ)।
- CreateStringIterator (S) पर लौटें।
अवलोकन किया जा रहा CreateStringIterator
अंत में आप के लिए ले जाता है 21.1.5.2.1 %StringIteratorPrototype%.next ( )
, जो करता है:
- Cp होने दो! CodePointAt (s, स्थिति)।
- परिणामी स्ट्रिंग को cp युक्त स्ट्रिंग मान हो। [[CodeUnitCount]] अनुक्रमणिका स्थिति में कोड इकाई के साथ शुरुआत से लगातार कोड इकाइयाँ।
- O को सेट करें। [[StringNextIndex]] को स्थिति + cp। [[CodeUnitCount]]।
- CreateIterResultObject (resultString, गलत) पर लौटें।
वह CodeUnitCount
है जो आप में रुचि रखते हैं। यह नंबर CodePointAt से आता है :
- पहले स्ट्रिंग के भीतर सूचकांक स्थिति में कोड इकाई होने दें।
- बता दें कि cp वह कोड पॉइंट है जिसका संख्यात्मक मान पहले होता है।
यदि पहले एक प्रमुख सरोगेट या ट्रेलिंग सरोगेट नहीं है, तो
ए। रिकॉर्ड लौटाओ { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }
।
यदि पहले एक अनुगामी सरोगेट या स्थिति + 1 = आकार है, तो
रिकॉर्ड दर्ज करें { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }
।
दूसरी स्ट्रिंग के भीतर इंडेक्स स्थिति + 1 पर कोड इकाई होने दें।
यदि दूसरा अनुगामी सरोगेट नहीं है, तो
ए। रिकॉर्ड लौटाओ { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }
।
Cp को सेट करें! UTF16DecodeSurrogatePair (पहला, दूसरा)।
रिकॉर्ड लौटाओ { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }
।
इसलिए, जब एक स्ट्रिंग के साथ पुनरावृत्ति होती है Array.from
, तो यह केवल 2 का एक कोड यूनेटिट रिटर्न देता है, जब प्रश्न में वर्ण एक सरोगेट जोड़ी की शुरुआत होता है। सरोगेट जोड़े के रूप में व्याख्या किए गए वर्ण यहां वर्णित हैं :
इस तरह के ऑपरेशन समावेशी रेंज में 0xD800 से 0xDBFF (यूनिकोड स्टैंडर्ड द्वारा एक प्रमुख सरोगेट के रूप में परिभाषित , या अधिक औपचारिक रूप से एक उच्च-सरोगेट कोड इकाई के रूप में) और हर कोड इकाई में एक संख्यात्मक मान के साथ हर कोड इकाई के लिए विशेष उपचार लागू करते हैं। निम्न नियमों का उपयोग करके समावेशी श्रेणी 0xDC00 से 0xDFFF (एक अनुगामी सरोगेट के रूप में परिभाषित किया गया है, या औपचारिक रूप से कम-सरोगेट कोड इकाई के रूप में)।
षि
सरोगेट जोड़ी नहीं है:
console.log('षि'.charCodeAt()); // First character code: 2359, or 0x937
console.log('षि'.charCodeAt(1)); // Second character code: 2367, or 0x93F
लेकिन इसके 👍
पात्र हैं:
console.log('👍'.charCodeAt()); // 55357, or 0xD83D
console.log('👍'.charCodeAt(1)); // 56397, or 0xDC4D
का पहला चरित्र कोड '👍'
हेक्स, डी 83 डी में है, जो 0xD800 to 0xDBFF
प्रमुख सरोगेट की सीमा के भीतर है । इसके विपरीत, का पहला वर्ण कोड 'षि'
बहुत कम है, और नहीं है। तो 'षि'
अलग हो जाता है, लेकिन'👍'
नहीं करता है।
षि
दो अलग-अलग पात्रों से बना है: ष
, देवनागरी पत्र सर्व शिक्षा अभियान , और ि
, देवनागरी स्वर मैं साइन । जब इस क्रम में एक-दूसरे के बगल में होते हैं, तो वे दो अलग-अलग वर्णों से बने होने के बावजूद, नेत्रहीन रूप से एक ही वर्ण में संयोजित हो जाते हैं।
इसके विपरीत, 👍
केवल एक ग्लिफ़ के रूप में एक साथ होने पर वर्ण कोड केवल समझ में आता है। यदि आप दूसरे के बिना कोड बिंदु के साथ एक स्ट्रिंग का उपयोग करने की कोशिश करते हैं, तो आपको एक बकवास प्रतीक मिलेगा:
console.log('👍'[0]);
console.log('👍'[1]);