प्रश्न में केवल परिणाम को पुन: स्थापित करने के बजाय, मैं का विवरण देने का प्रयास करूंगा क्यों आपको वह परिणाम मिलता है।
स्पष्टीकरण
केवल पहला उदाहरण ले रहा है (बाकी कुछ इसी तरह करना होगा क्योंकि), हम विनिर्देश देखने के लिए कि क्या होता है का पालन कर सकते हैं।
11.4.6 Unary + Operator से, हम देख सकते हैं कि ToNumber
रूपांतरण होता है।
वापसी करने के लिए संख्या (GetValue (expr))।
9.3 ToNumber से हम देखते हैं कि अगर एक वस्तु (अपने सरणी की तरह) को देखते हुए एक ToPrimitive
रूपांतरण ToNumber
पर एक और प्रयास के बाद जगह लेता है।
वस्तु
निम्न चरणों को लागू करें:
- primValue ToPrimitive (इनपुट तर्क, संकेत संख्या) बनें।
- वापसी करने के लिए संख्या (PrimValue)।
9.1 To Primitive से
, अगर ToPrimitive
एक वस्तु हो जाता है, हम देख सकते हैं कि अपनी [[DefaultValue]]
लाई गई है:
वस्तु
वापसी वस्तु लिए एक डिफ़ॉल्ट मान। किसी ऑब्जेक्ट का डिफ़ॉल्ट मान ऑब्जेक्ट की [[DefaultValue]] आंतरिक विधि को कॉल करके पुनर्प्राप्त किया जाता है, वैकल्पिक संकेत PreferredType को पारित करता है। [[DefaultValue]] आंतरिक विधि का व्यवहार सभी मूल ECMAScript ऑब्जेक्ट्स के लिए 8.12.8 में इस विनिर्देशन द्वारा परिभाषित किया गया है।
8.12.8 [[DefaultValue]] (hint) से
, क्या अंत में क्या होगा होगा कि toString()
सरणी पर बुलाया जाएगा, और लौट आए। ऊपर वर्णित अनुसार यह स्ट्रिंग रिकर्सिव ToNumber
पर भेजी जाती है।
तो क्या होता है जब ToNumber
रूपांतरण स्ट्रिंग पर किया जाता है? वैसे यह 9.3.1 ToNumber Applied to the String Type में वर्णित है, और थोड़ा लंबा है। , क्या स्ट्रिंग कर हम अपने सरणी से वापस पाने के
Number(""); // result is 0 on an empty string
Number(" "); // result is 0 on a string with only whitespace
Number("123"); // result is 123 on a numeric string
Number(" 123 ");// result is 123 on a numeric string with leading & trailing spaces
Number("abc"); // result is NaN (not a number) on non-numeric strings
तो सवाल यह है: सरल बस सीधे रूपांतरण करते हैं, और देखो क्या होता है। फिर, यह परीक्षण करने में आसान है।
[].toString(); // result is "" (empty string)
के बाद से परिणाम एक खाली स्ट्रिंग है, और एक खाली स्ट्रिंग के एक ToNumber
रूपांतरण 0
के रूप में ऊपर दिखाए गए, मतलब यह होगा कि हम 0 === 0
की तुलना कर रहे है।
यह वही मानो हमने किया होगा:
Number([].toString()) === 0; // true
या यह एक थोड़ा और अधिक बाहर आकर्षित करने के लिए:
var x = [];
x = x.toString(); // ""
x = Number(x); // 0
x === 0; // true
अधिक toString
का परिणाम है।
सरणी के अधिक toString
रूपांतरण दिखाने के लिए, निम्नलिखित पर विचार:
[1].toString(); // "1"
[1,2,3].toString(); // "1,2,3"
["a",1,"b",2].toString(); // "a,1,b,2"
तो ऊपर सरणी पर एक ToNumber
रूपांतरण करने के लिए, पहले हमें एक नंबर देना होगा, और पिछले दो में परिणाम होगा NaN
।
Number([1]); // 1
Number([1,2,3]); // NaN
Number(["a",1,"b",2]); // NaN
कुछ सबूत
और सबूत है कि इस toString()
रूपांतरण ToNumber
रूपांतरण से पहले होता है प्रदान करने के लिए, हम वास्तव में Array.prototype.toString
संशोधित भिन्न परिणाम प्रदान करने के लिए कर सकते हैं, और किसी भी ToNumber
रूपांतरण का उपयोग करेगा कि संशोधित परिणाम
Array.prototype.toString = function() {
var n = 0;
for(var i = 0; i < this.length; i++) {
n += this[i];
}
return n;
};
यहाँ मैं एक समारोह है कि सरणी का योग के साथ Array.prototype
पर toString
से बदल दिया है। जाहिर है आप यह नहीं करना चाहते हैं, लेकिन हम दिखा सकते हैं कि अब हम एक अलग परिणाम कैसे प्राप्त करेंगे।
Number([1,2,3]); // 6
+[1,2,3]; // 6
तो अब आप कि हमारे सरणी की ToNumber
रूपांतरण है कि पहले NaN
में हुई है | अब सरणी में आइटम का कुल योग में जिसके परिणामस्वरूप है देख सकते हैं।
मुझे लगता है कि अगर मैं कुछ कोड में आया तो मैं डेस्क को फ्लिप कर दूंगा। –
उत्तर है: '+ [NaN] == !!!! 0 && + [{}] + ~~ [[]] - []' – jAndy
यदि मैंने देखा कि किसी भी कोडबेस में मैं मूल डेवलपर को फिर से लिखने के लिए कहूंगा यह। यह बहुत बुरा अभ्यास है !!! –