2011-01-26 17 views
54

क्या कोई उनमें से दोनों के बीच वैचारिक अंतर समझा सकता है। कहीं भी पढ़ें कि दूसरा एक मौजूदा सरणी के सभी संदर्भों को नष्ट कर एक नई सरणी बनाता है और .length = 0 बस सरणी खाली करता है। लेकिन यह मेरे मामले में काम नहीं करताArray.length = 0 और Array = [] के बीच अंतर?

//Declaration 
var arr = new Array(); 

नीचे दिया गया लूपिंग कोड बार-बार निष्पादित करता है।

$("#dummy").load("something.php",function(){ 
    arr.length =0;// expected to empty the array 
    $("div").each(function(){ 
     arr = arr + $(this).html(); 
    }); 
}); 

लेकिन अगर मैं arr.length=0 के स्थान पर arr =[] साथ कोड के स्थान पर यह ठीक काम करता है। क्या कोई यह बता सकता है कि यहां क्या हो रहा है।

+6

क्यों अपने कोड पाशन है 'आगमन = आगमन + $ (this) .html() (ओपेरा में 11 परीक्षण किया);'? यदि आप अपनी सरणी में सामान जोड़ रहे हैं तो आपको इसके बजाय 'Array.push()' का उपयोग करना चाहिए। – BoltClock

+1

यह मजाकिया है क्योंकि पहले से ही 9 अपरिवर्तित उत्तर है, फिर भी यह अभी भी ** अस्पष्ट ** ओपी की अंतर्दृष्टि क्या है ... – galambalazs

+0

@ बोल्ट - मैंने अभी कोड का नमूना दिया है, मूल कोड तत्वों को गतिशील रूप से सरणी में जोड़ता है .. मैंने धक्का() के बजाय तत्वों को सरणी में जोड़ना चुना। क्या मैं जो खोज रहा हूं उसमें बहुत अंतर आता है? –

उत्तर

74

foo = [] एक नई सरणी बनाता है और इसे एक चर के संदर्भ में निर्दिष्ट करता है। कोई अन्य संदर्भ अप्रभावित है और अभी भी मूल सरणी को इंगित करता है।

foo.length = 0 सरणी को स्वयं संशोधित करता है। यदि आप इसे एक अलग चर के माध्यम से एक्सेस करते हैं, तो आपको अभी भी संशोधित सरणी मिलती है।

कहीं पढ़ा है कि एक दूसरे के मौजूदा सरणी

पीछे की ओर है कि सभी संदर्भों को नष्ट करके एक नई सरणी बनाता है। यह एक नई सरणी बनाता है और अन्य संदर्भों को नष्ट नहीं करता है।

var foo = [1,2,3]; 
var bar = [1,2,3]; 
var foo2 = foo; 
var bar2 = bar; 
foo = []; 
bar.length = 0; 
console.log(foo, bar, foo2, bar2); 

देता है:

[] [] [1, 2, 3] [] 
+0

लेकिन, अभी भी ... आपकी पोस्ट पढ़ने के बाद मुझे समझ में नहीं आता कि यह इस मुद्दे को समझाने में क्यों मदद करता है। जो मैंने समझा, उससे 'एआर' एक वैश्विक var है, और इस प्रकार सभी संदर्भों को एक ही वस्तु को इंगित करना चाहिए। –

+0

आपने ओपी को वह दिया जो उसने मांगा था, लेकिन उसे जो चाहिए वह नहीं। :) कभी-कभी ये दोनों समान नहीं होते हैं। – galambalazs

+0

धन्यवाद डेविड, लेकिन फिर भी मुझे समझ में नहीं आता है कि उपर्युक्त मामले में सरणी लंबाई = 0 के साथ क्यों खाली नहीं हो रही है। सरणी में तत्वों के गतिशील निर्माण के साथ कुछ करने के लिए है। –

1

अंतर यहाँ सबसे अच्छा निम्न उदाहरण में बताया गया है:

var arrayA = [1,2,3,4,5]; 

function clearUsingLength (ar) { 
    ar.length = 0; 
} 

function clearByOverwriting(ar) { 
    ar = []; 
} 

alert("Original Length: " + arrayA.length); 
clearByOverwriting(arrayA); 
alert("After Overwriting: " + arrayA.length); 
clearUsingLength(arrayA); 
alert("After Using Length: " + arrayA.length); 

वाले का एक लाइव डेमो यहाँ देखा जा सकता: http://www.jsfiddle.net/8Yn7e/

जब आप एक वैरिएबल सेट करते हैं जो एक मौजूदा सरणी को इंगित करता है ताकि एक नई सरणी को इंगित किया जा सके, आप सभी डी हैं ओंग उस वैरिएबल को उस मूल सरणी के लिंक को तोड़ रहा है।

आप array.length = 0 (और उदाहरण के लिए array.splice(0, array.length) जैसे अन्य तरीकों) का उपयोग करते हैं, तो आप वास्तव में मूल सरणी खाली कर रहे हैं।

+0

कौन सा ब्राउज़र डॉन करता है 't समर्थन' array.length = 0'? – user2013

+1

@ArthaeyAngosii: हे, कोई भी जिसे मैं जानता हूं। जाहिर है, मैं भद्दा था और जनवरी 2011 में बकवास के साथ जवाब देने का आनंद लिया ... इसे इंगित करने के लिए धन्यवाद;)। – Matt

0

क्या आप वाकई वाकई काम करते हैं?

मैंने यहां थोड़ा प्रयोग किया, और स्ट्रिंग के साथ एक ऐरे को "जोड़ने" की कोशिश कर एक स्ट्रिंग में परिणाम दिया।

function xyz(){ 
    var a = []; 
    alert(typeof(a+$("#first").html())); 
    // shows "string" 
} 

http://www.jsfiddle.net/4nKCF/

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