2017-08-26 3 views
24

पहली पंक्ति क्यों काम करती है जबकि दूसरी पंक्ति run-time exception फेंकता है?क्यों [[]] [0] ++ काम करता है लेकिन [] ++ रन-टाइम अपवाद फेंकता है?

प्रथम पंक्ति:

[[]][0]++; //this line works fine 

दूसरी पंक्ति:

[]++; //this lines throws exception 
+1

हाँ, मुझे लगता है कि बहुत से लोगों को डेव ब्लॉग को पढ़ने: https://davidwalsh.name/thinking-javascript –

+7

क्योंकि जावास्क्रिप्ट। –

+0

आप अन्यथा क्यों उम्मीद करेंगे? क्या आप समझा सकते हैं कि पहली पंक्ति को अपवाद क्यों फेंकना चाहिए, या दूसरी पंक्ति को क्या करना चाहिए जब यह नहीं होगा? – Bergi

उत्तर

17
[[]][0]++ 

var tmp = [[]]; 
tmp[0] = tmp[0]+1; 

tmp[0] के बराबर है है एक खाली सरणी है, जो करने के लिए डाला जाता है संख्या 0, डब्ल्यू 1 में वृद्धि हुई है।

यह केवल इसलिए काम करता है क्योंकि <array>[<index>]++ मान्य दिखता है। इसमें कुछ प्रकार की जॉगलिंग होती है, लेकिन यह वहां जाती है।

लेकिन []++ बिल्कुल अमान्य है। इसे समझने का कोई तरीका नहीं है।

[] = []+1; 

बाएं हाथ की ओर वास्तव में अमान्य है। आप खाली सरणी को असाइन नहीं कर सकते हैं।

+1

यह '[' '] [0] ++ 'और' [null] [0] ++ 'और' [false] [0] ++ 'के साथ भी काम करता है क्योंकि वे सभी' 0' पर आते हैं। – Soviut

+7

यह उत्तर गलत है। इसका "वैध" वैध से कोई लेना देना नहीं है। यह सिर्फ इतना है कि '++' ऑपरेटर को एक संदर्भ की आवश्यकता होती है, जो '[]' (एक शाब्दिक) नहीं है। – Nikolai

4

यह एक दुर्लभ मामला है जिसमें जावास्क्रिप्ट ऐसा कुछ करता है जो वास्तव में समझ में आता है। पर विचार करें

x[3]++; // Valid 
3++; // Not valid 

तो आप के लिए यह कर भावना, तो क्या आश्चर्य की बात

के बारे में
[[]][0]++; // valid 
[]++;  // not valid 

<array>[index] "एक जगह" है कि आप कर सकते हैं या वेतन वृद्धि कर सकता है। बस इतना ही। तथ्य यह है कि आप a[<expr>] बढ़ा सकते हैं इसका मतलब यह नहीं है कि आप <expr> बढ़ा सकते हैं।

बेतुका बात यह है कि आप एक सूचकांक, संख्या 0 को एक खाली स्ट्रिंग "" को सरणी परिवर्तित करने और उसके बाद का अर्थ है कि के रूप में उपयोग कर सकते हैं [] है, लेकिन इस जावास्क्रिप्ट का बेतुका अंतर्निहित रूपांतरण के प्रसिद्ध समस्या है । वे निहित रूपांतरण नियम जावास्क्रिप्ट का एक बड़ा हिस्सा हैं और उदाहरण के लिए 1 == [1] या []==false और (![])==false दोनों का अर्थ है।

जावास्क्रिप्ट बहुत सारे स्थानों में शुद्ध बकवास है ... लेकिन वास्तव में यहां नहीं।

10

++ ऑपरेटर (या वास्तव में कोई पोस्टफिक्स ऑपरेटर) को ऑपरेंड को "संदर्भ" होना आवश्यक है - यानी, एक मान जिसे असाइन किया जा सकता है। [] एक शाब्दिक है, इसलिए आप इसे असाइन नहीं कर सकते हैं। [[]][0] एक अस्थायी सरणी के तत्व के लिए एक मान्य संदर्भ है।

0++; // not valid, `0` is a literal. 
var a = []; 
a++; // ok, `a` is assignable 
संबंधित मुद्दे