वेन के उत्तर के पूरक के लिए और यह समझाने की कोशिश करने के लिए कि ToPrimitive([])रिटर्न क्यों है "", यह 'क्यों' प्रश्न के दो संभावित प्रकारों के जवाबों पर विचार करने के लायक है। पहला प्रकार का उत्तर है: "क्योंकि विनिर्देश कहता है कि यह कैसे जावास्क्रिप्ट व्यवहार करेगा।" ES5 कल्पना में, खंड 9.1 , जो एक वस्तु के लिए डिफ़ॉल्ट मूल्य के रूप में ToPrimitive के परिणाम का वर्णन करता है:
ऑब्जेक्ट का डिफ़ॉल्ट मान [[DefaultValue]] आंतरिक विधि को कॉल करके प्राप्त किया जाता है, वैकल्पिक संकेत PreferredType से गुजर रहा है।
धारा 8.12.8[[DefaultValue]] विधि का वर्णन करती है। यह विधि एक तर्क के रूप में "संकेत" लेती है, और संकेत या तो स्ट्रिंग या संख्या हो सकती है। कुछ विवरणों के साथ वितरण करके मामले को सरल बनाने के लिए, यदि संकेत स्ट्रिंग है, तो यदि मौजूद है तो [[DefaultValue]]मान toString()लौटाता है और एक आदिम मान लौटाता है और अन्यथा का मान लौटाता है valueOf()। संकेत संख्या, की प्राथमिकताओं है toString()और valueOf()कि इतने उलट कर रहे हैं valueOf()पहले कहा जाता है और उसके मान दिया है, तो यह एक आदिम है। इस प्रकार, चाहे [[DefaultValue]]वह परिणाम लौटाए toString()या valueOf()वस्तु के लिए निर्दिष्ट PreferredType पर निर्भर करता है या नहीं और ये फ़ंक्शन आदिम मान लौटाते हैं या नहीं।
डिफ़ॉल्ट valueOf()ऑब्जेक्ट विधि सिर्फ ऑब्जेक्ट को ही लौटाती है, जिसका अर्थ है कि जब तक कोई वर्ग डिफ़ॉल्ट विधि को ओवरराइड नहीं करता है, तब तक valueOf()केवल ऑब्जेक्ट ही वापस आता है। यह मामला है Array। [].valueOf()वस्तु को []ही लौटाता है। चूंकि एक Arrayवस्तु एक आदिम नहीं है, [[DefaultValue]]संकेत अप्रासंगिक है: एक सरणी के लिए वापसी मूल्य का मूल्य होगा toString()।
डेविड फ्लैनगन के जावास्क्रिप्ट को उद्धृत करने के लिए : निश्चित गाइड , जो, एक शानदार किताब है, जो इस प्रकार के सवालों के जवाब पाने के लिए हर किसी की पहली जगह होनी चाहिए:
इस ऑब्जेक्ट-टू-नंबर रूपांतरण का विवरण बताता है कि खाली सरणी संख्या 0 में क्यों परिवर्तित होती है और एकल तत्व वाला सरणी भी संख्या में परिवर्तित हो सकता है। एरे को डिफ़ॉल्ट मान (ओफ़) विधि विरासत में मिली है जो एक वस्तु को एक आदिम मूल्य के बजाय लौटाती है, इसलिए सरणी-टू-नंबर रूपांतरण स्ट्रींग () विधि पर निर्भर करता है। खाली सरणियाँ खाली स्ट्रिंग में परिवर्तित होती हैं। और खाली स्ट्रिंग संख्या 0. में परिवर्तित हो जाती है। एकल तत्व वाला एक सरणी उसी स्ट्रिंग में परिवर्तित होता है जो एक तत्व करता है। यदि किसी सरणी में एक एकल संख्या होती है, तो वह संख्या एक स्ट्रिंग में बदल जाती है, और फिर एक नंबर पर वापस आ जाती है।
"क्यों" प्रश्न के दूसरे प्रकार के उत्तर, "क्योंकि कल्पना कहती है" के अलावा, इस बात के लिए कुछ स्पष्टीकरण देता है कि व्यवहार डिजाइन के दृष्टिकोण से क्यों समझ में आता है। इस मुद्दे पर मैं केवल अटकलें लगा सकता हूं। सबसे पहले, एक सरणी को एक संख्या में कैसे परिवर्तित किया जाएगा? एकमात्र समझदार संभावना जिसे मैं सोच सकता हूं कि खाली सरणी को 0 और किसी गैर-रिक्त सरणी में 1 में परिवर्तित किया जाएगा। लेकिन जैसा कि वेन के उत्तर से पता चला है, एक खाली सरणी किसी भी तरह की तुलना के लिए 0 में परिवर्तित हो जाएगी। इससे परे, Array.valueOf () के लिए एक समझदार आदिम वापसी मूल्य के बारे में सोचना मुश्किल है। तो कोई यह तर्क दे सकता है कि यह केवल Array.valueOf()डिफ़ॉल्ट होने के लिए अधिक समझ में आता है और एरे को खुद लौटाता है, अग्रणीtoString() एरियर को परिणामस्वरूप ToPrimitive द्वारा उपयोग किया जाता है। यह सिर्फ एक संख्या के बजाय एक ऐरे को एक स्ट्रिंग में बदलने के लिए अधिक समझ में आता है।
इसके अलावा, जैसा कि फ्लैनगन उद्धरण द्वारा संकेत दिया गया है, यह डिजाइन निर्णय कुछ प्रकार के लाभकारी व्यवहारों को सक्षम करता है। उदाहरण के लिए:
var a = [17], b = 17, c=1;
console.log(a==b); // <= true
console.log(a==c); // <= false
यह व्यवहार आपको एकल-तत्व सरणी की संख्या से तुलना करने और अपेक्षित परिणाम प्राप्त करने की अनुमति देता है।