2008-10-03 19 views
9

के बाद से लंबाई एक जावास्क्रिप्ट संपत्ति है, यह फर्क पड़ता है कि क्या मैं का उपयोगक्या जावास्क्रिप्ट गुण प्रत्येक कॉल पर गणना करते हैं?

for(var i = 0; i < myArray.length; i++) 

या

var myArrayLength = myArray.length; 
for(var i = 0; i < myArrayLength ; i++) 

उत्तर

9
for(var i = 0, iLen = myArray.length; i < iLen; i++) 

विभिन्न जावास्क्रिप्ट पाश निर्माण के मानक के लिए http://blogs.oracle.com/greimer/resource/loop-test.html देखें ts।

+0

दो दृष्टिकोणों के बीच अंतर एक सरणी के लिए लापरवाह है। डीओएम से निपटने पर यह केवल महत्वपूर्ण हो जाता है। – AnthonyWJones

2

यदि myArray जावास्क्रिप्ट सरणी है तो इससे कोई फर्क नहीं पड़ता कि आप इसके बारे में चिंता करने के लिए पर्याप्त हैं, इसकी एक संपत्ति किसी ऑब्जेक्ट पर दिखाई देती है लेकिन फिर परिवर्तनीय उपयोग है।

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

for (var i = 0, length = col.length; i < length; i++) 

लेकिन सरणी के लिए मैं इससे परेशान नहीं हूं।

+0

स्थानीय चर का उपयोग करना एक संपत्ति का उपयोग नहीं है - यह कार्यान्वयन के आधार पर प्रत्यक्षता की विभिन्न डिग्री के साथ, एक बहुत तेज प्रत्यक्ष लुकअप है। कोई बड़ा कार्यान्वयन नहीं है (पाठ्यक्रम * एसई * के आईई को छोड़कर) अब एक वास्तविक संपत्ति लुकअप करता है। – olliej

1

नहीं। यह कॉल पर पुन: गणना नहीं करता है। यह ऐरे वर्ग के भीतर आवश्यक के रूप में पुन: गणना करता है।

जब आप धक्का, पॉप, पारी, unshift, बस एक संख्या concat, जोड़, आदि अन्यथा, यह है का उपयोग यह बदल देंगे - एक ही उदाहरण हर बार आप इसके मूल्य के लिए कहते हैं।

लेकिन, जब तक आप इसे स्पष्ट रूप से ओवरराइड नहीं करते हैं (array.length = 0), यह प्रत्येक कॉल के साथ सटीक होगा।

0

दूसरा रूप में तेजी से हो सकता है:

function p(f) { var d1=new Date(); for(var i=0;i<20;i++) f(); print(new Date()-d1) } 
p(function(){for(var i=0;i<1000000; i++) ;}) 
p(function(){var a = new Array(1000000); for(var i=0;i<a.length; i++) ;}) 
> 823 
> 1283 

..it वास्तव में किसी भी गैर बढ़त मामले में कोई फर्क नहीं करना चाहिए।

1

लंबाई कॉल की गणना प्रत्येक कॉल पर नहीं की जाती है, लेकिन बाद वाला संस्करण तेज़ होगा क्योंकि आप संपत्ति लुकअप को कैश कर रहे हैं। यहां तक ​​कि सबसे अद्यतित जेएस कार्यान्वयन (वी 8, ट्रेसमोन्की, गिलहरीफिश चरम) के साथ भी उन्नत (उदाहरण के लिए स्मॉलटाक युग;)) संपत्ति लुकअप करने वाली संपत्ति अभी भी कम से कम एक अतिरिक्त सशर्त शाखा है जो आपके दूसरे संस्करण से अधिक है।

ऐरे। लम्बाई स्थिर नहीं है हालांकि जेएस Arrays mutable हैं, इसलिए push, pop, array[array.length]=0, etc सभी इसे बदल सकते हैं।

अन्य अवधारणाएं हैं जैसे डीओएम NodeList एस जो आपको document.getElementsBySelector जैसी कॉल से प्राप्त होती हैं, जिनकी स्थिति में रहने की उम्मीद है, जिस स्थिति में लंबाई को फिर से दबाया जा सकता है। लेकिन फिर यदि लंबाई को फिर से दबाया जाता है तो यह एक अच्छा मौका है कि यह वास्तव में भी बदल जाएगा, इसलिए आउटपुट को मैन्युअल रूप से कैशिंग करना वैध नहीं हो सकता है।

0

ECMAScript specification के अनुसार, यह सिर्फ "लंबाई" संपत्ति गणना की जानी चाहिए कि कैसे बताता है, लेकिन यह कहते नहीं करता जब। मुझे लगता है कि यह कार्यान्वयन पर निर्भर हो सकता है।

अगर मैं इसे लागू करना चाहता था, तो मैं Jonathan के रूप में इंगित करता हूं, लेकिन यह कि ऐरे ऑब्जेक्ट्स की "लंबाई" संपत्ति के मामले में होता है।

0

क्या तुमने कभी एक विचार है कि यह पाशन तो निश्चित रूप से यह हर पाश के लिए जाँच की जानी चाहिए के दौरान बदल सकता है ...

है - और यह स्पष्ट रूप से एक वस्तु कई बार पूछने के लिए पागल है, यह होगा के रूप में यदि आप अगर बयान के मूल्यांकन-संपत्ति में रख हो ...

if(i=0, iMax=object.length; iMax>i; i++) 

- केवल विशेष मामलों आप अन्यथा करने का सोचना चाहिए में -!)

2

मैं का जवाब लगता है आपके प्रश्न का इरादा है, हां, सरणी। लम्बाई संपत्ति प्रत्येक के पुन: गणना की जाती है यदि आप लूप में सरणी को संशोधित करते हैं तो लूप के माध्यम से eration। उदाहरण के लिए, निम्न कोड:

var arr = [1,2,3]; 
for(var i = 0; i < arr.length; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

इच्छा उत्पादन:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 

इस कोड जबकि:

var arr = [1,2,3]; 
var l = arr.length; 
for(var i = 0; i < l; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

इच्छा उत्पादन:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 
i = 2 
indexed value = undefined 

-J

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