2009-10-27 18 views
32

हमें एक एजेंसी से कुछ जावास्क्रिप्ट प्राप्त हुआ है जो गलत दिखता है, लेकिन काम करता है।जावास्क्रिप्ट चर के चारों ओर [वर्ग ब्रैकेट] का उपयोग

किसी कारण से वे, चर के आसपास [वर्ग कोष्ठक] जोड़ रहे हैं इस प्रकार:

var some_variable = 'to=' + [other_variable]; 

यह काम करता है, लेकिन पूरी तरह से वर्ग कोष्ठक ज़रूरत से ज़्यादा लगते हैं।

क्या इस वाक्यविन्यास का कोई उद्देश्य है या यह तकनीकी रूप से गलत है, लेकिन ब्राउज़र द्वारा अनदेखा किया गया है?

उत्तर

41

स्क्वायर ब्रैकेट का अर्थ है नया ऐरे।

var ar=new Array("a","b"); 
var ar=["a","b"]; //Equal to the syntax above 
उस स्थिति में

कोई अंतर नहीं है अगर तुम वर्ग कोष्ठक का उपयोग करें या नहीं, क्योंकि अगर यह एक सरणी यह ​​स्ट्रिंग में बदल जाती है है, लेकिन अगर आप कोष्ठक हटा दें यह कम समय लगता है, क्योंकि यह एक निर्माण करने के लिए नहीं है नई सरणी और इसे परिवर्तित करें लेकिन यह एक साधारण स्ट्रिंग के साथ काम करता है।

+1

तो मेरी परीक्षा में एक तत्व युक्त एक नई सरणी बनाई जा रही है? –

+1

हां। इसका मतलब है कि एक सरणी तत्व बनाया गया है। – Murvinlai

+4

हां और फिर इसे स्ट्रिंग में परिवर्तित कर दिया गया है – mck89

5

हो सकता है यह ..

स्क्वायर ब्रैकेट संकेतन

वर्ग कोष्ठक अंकन के साथ ग्लोबल चर पहुँच वहाँ कोष्ठक के बाईं ओर वस्तु संदर्भ में किसी प्रकार का हो सकता है कि आवश्यकता है।

["document"] //Array literal, not a Property Accessor! 

अगर एक प्रयास यह करने के लिए एक मूल्य निर्दिष्ट किया जाता है -will कोई त्रुटि उत्पन्न, के रूप में यह, शाब्दिक शृंखला रूप में माना जाएगा अगर यह से पढ़ने के लिए एक प्रयास स्ट्रिंग वाली एक तत्व सरणी किया जाता है ब्रैकेट के भीतर वापस आ गया है। वैश्विक चर आमतौर पर उनके एक पहचानकर्ता द्वारा संदर्भित किया जाता है। ऐसा लगता है कि वैश्विक पहचान को उस स्ट्रिंग का उपयोग करके संदर्भित करने की संभावना से बाहर रखा जा सकता है, जिसमें उनके पहचानकर्ता नाम या अभिव्यक्ति का निर्माण किया गया हो या उनका नाम लौटाया गया हो। हालांकि, जावास्क्रिप्ट वैश्विक चर (और उस मामले के लिए वैश्विक कार्य नाम) वैश्विक वस्तु के गुण हैं। ग्लोबल ऑब्जेक्ट का संदर्भ रखने वाले किसी भी पहचानकर्ता को स्क्वायर ब्रैकेट के बाईं ओर एक प्रॉपर्टी एक्सेसर बनाने के लिए इस्तेमाल किया जा सकता है जो वैश्विक चर को संदर्भित करता है।

वेब ब्राउज़र में वैश्विक वस्तु विंडो (या फ्रेम) है जिसमें स्क्रिप्ट चल रही है। प्रत्येक विंडो (या फ्रेम) ऑब्जेक्ट में कई गुण होते हैं, जिनमें से कम से कम दो विंडो (वैश्विक वस्तु) के संदर्भ हैं। ये गुण 'खिड़की' और 'स्वयं' हैं। वैश्विक चरों का जिक्र करते समय इन संपत्ति नामों को स्क्वायर ब्रैकेट के बाईं ओर पहचानकर्ता के रूप में उपयोग किया जा सकता है। तो एक वैश्विक चर दिया के रूप में परिभाषित: - वैश्विक चर के रूप में संदर्भित किया जा सकता

var anyName = 0; 
  • कि: -

    विंडो [ "anyName"]

किसी अन्य उपयोग के साथ के रूप में वर्ग ब्रैकेट नोटेशन के, ब्रैकेट के अंदर की स्ट्रिंग को एक चर में रखा जा सकता है या एक अभिव्यक्ति द्वारा निर्मित/लौटाया जा सकता है।

वैश्विक संदर्भ में निष्पादित कोड, वैश्विक कार्यों के भीतर कोड (नए कीवर्ड के साथ ऑब्जेक्ट कन्स्ट्रक्टर को छोड़कर) और किसी भी फ़ंक्शन के बाहर इनलाइन कोड, इस कीवर्ड का उपयोग वैश्विक ऑब्जेक्ट को संदर्भित करने के लिए भी कर सकता है। यह कीवर्ड निष्पादन संदर्भ के आधार पर किसी ऑब्जेक्ट को संदर्भित करता है।वैश्विक संदर्भ में कोड निष्पादन के लिए यह वैश्विक वस्तु है (एक वेब ब्राउज़र पर, विंडो ऑब्जेक्ट)। नतीजतन, उपरोक्त चर को इस ["anyName"] के रूप में संदर्भित किया जा सकता है, लेकिन केवल वैश्विक संदर्भ में निष्पादित कोड में।

हालांकि, इस कीवर्ड का उपयोग करने से भ्रमित होने की संभावना बहुत अधिक है, खासकर उन स्क्रिप्ट्स जिनमें कस्टम जावास्क्रिप्ट ऑब्जेक्ट्स शामिल हैं, जहां उन ऑब्जेक्ट्स के विधियों (और कन्स्ट्रक्टर) इसका उपयोग अपने ऑब्जेक्ट इंस्टेंस के संदर्भ में करेंगे।

कुछ जावास्क्रिप्ट कार्यान्वयन में वैश्विक वस्तु की संपत्ति नहीं है जो वैश्विक वस्तु को संदर्भित करती है। वैश्विक चरों तक पहुंचने के लिए इस कीवर्ड का उपयोग करने की कोशिश करने के बजाय वैश्विक वस्तु को संदर्भित करने वाला अपना वैश्विक चर बनाना संभव है।

var myGlobal = this; 
  • एक स्क्रिप्ट के शुरू में इनलाइन कोड के रूप में मार डाला (उस संदर्भ में इस) वैश्विक वस्तु के लिए एक संदर्भ प्रदान करेंगे। तब से सभी वैश्विक चरों को स्क्वायर ब्रैकेट नोटेशन के साथ संदर्भित किया जा सकता है: -

    myGlobal ["anyName"];

  • और किसी भी निष्पादन संदर्भ से वैश्विक वस्तु को संदर्भित करने के लिए myGlobal की अपेक्षा करें।

14
b = "bar" + ["foo"] 

इस वाक्य रचना सही है, लेकिन वास्तव में बहुत, बहुत, ज़रूरत से ज़्यादा। यह वह जगह है कि यह कैसे काम करता है:

"bar" + ["foo"] 

जब + प्रयोग किया जाता है, और में से एक:

["foo"] 

जावास्क्रिप्ट स्ट्रिंग "foo" "foo" लेता है और एक तत्व के साथ एक सरणी में बदल देता है, ऑपरेंड एक स्ट्रिंग है, इस मामले में "बार", जावास्क्रिप्ट दूसरे को स्ट्रिंग में बदल देता है। चूंकि ऑपरेंड दो एक ऐरे है, Array.toString विधि कहा जाता है, जो डिफ़ॉल्ट रूप से, सभी तत्वों को कॉमा द्वारा शामिल किया जाता है। हमारे पास एक तत्व है, और परिणाम इस तत्व के बराबर होगा, यानी, इस संदर्भ में "foo"["foo"] के बराबर है।

आप Array.toString को फिर से परिभाषित करते हैं तो आप बेहतर देख सकते हैं क्या हो रहा है:

alert("bar" + ["foo"]) 
Array.prototype.toString = function() { return "???"; } 
alert("bar" + ["foo"]) 
9

मुझे यकीन है किसी को बताया कि व्यक्ति: "एक सरणी के साथ स्ट्रिंग संयोजन करते हैं, यह तेजी से है"

अर्थ:

var some_variable = ['to=', other_variable].join(""); 

जाहिरा तौर पर तेजी से concatenations के बहुत सारे है, लेकिन पूरी तरह से अप्रासंगिक के लिए है कौन सा, के रूप में है कि कोड शायद वैसे भी सिर्फ एक बार चलेंगे। Premature_optimization = sqrt(all_evil)!

और गरीब अध्याय है कि अन्य अप्रासंगिक बात ...

मैं लोगों को प्यार किया।

var some_variable = 'to=' + other_variable; 

और इस:

var some_variable = 'to=' + [other_variable]; 

भिन्न परिणाम

9

यह एक स्थिति है जहाँ इस के निर्माण के लिए संभव है। विशेष रूप से, यदि Array.prototype.toString() विधि (या, मुझे लगता है, Array.prototype.join() विधि) को इसके डिफ़ॉल्ट से बदल दिया गया है, कुछ भी हो सकता है। उदाहरण के लिए, लॉगिंग जानकारी उत्पन्न करने के लिए Array.prototype.toString() विधि में अतिरिक्त कार्यक्षमता जोड़ा जा सकता है, कुछ लुकअप करें, या वास्तव में कुछ भी करें।

यह किया गया है कि यह किया गया है पतला है, मैं कल्पना करता हूं, लेकिन इसे पूर्णता के लिए उल्लेख किया जाना चाहिए।

28

यहां तक ​​कि सरणी प्रोटोटाइप बदले बिना वहाँ अंतर हैं:

var other_variable; 
var some_variable = 'to=' + [other_variable]; 

तो other_variable अपरिभाषित है, सरणी के साथ वापसी मान, 'करने के लिए =' है

सरणी के बिना वापसी मान है ' करने के लिए = अपरिभाषित '।

4

मामले किसी और यहाँ आता है बस में, पता लगाने के लिए क्या कुछ अजीब/नई शामिल [वर्ग कोष्ठक] वाक्य रचना (किसी और के जावास्क्रिप्ट में देखा) संभवतः हो सकता है की कोशिश करते समय जैसे मैं था ...

आजकल, ईएस 6 के साथ, हमारे पास [] भी सरणी को नष्ट करने के लिए बाईं ओर इस्तेमाल किया जाता है, उदाहरण के लिए

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names; 
console.log(first); // 'Luke' 
const [first, second] = names; 
console.log(first, second); // 'Luke' 'Eva' 

अधिक जानकारी के लिए http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/ या Google 'es6 destructuring' देखें।

संबंधित मुद्दे