2011-01-26 47 views
54

Một số người có thể giải thích sự khác biệt về khái niệm giữa hai người trong số họ. Đọc ở đâu đó thứ hai tạo ra một mảng mới bằng cách hủy tất cả các tham chiếu đến mảng hiện có và .length = 0 chỉ làm trống mảng đó. Nhưng nó không hoạt động trong trường hợp của tôiSự khác biệt giữa Array.length = 0 và Array = []?

//Declaration 
var arr = new Array(); 

Dưới đây là mã lặp lại thực hiện lặp đi lặp lại.

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

Nhưng nếu tôi thay thế mã bằng arr =[] ở vị trí của arr.length=0 nó hoạt động tốt. Bất cứ ai có thể giải thích những gì đang xảy ra ở đây.

+6

Tại sao mã của bạn looping 'arr = arr + $ .html (this)(); '? Nếu bạn đang thêm công cụ vào mảng của mình, bạn nên sử dụng 'Array.push()' để thay thế. – BoltClock

+1

Thật buồn cười vì đã có 9 câu trả lời được upvoted, nhưng vẫn còn ** không rõ ràng ** ý nghĩa của OP là gì ... – galambalazs

+0

@Bolt - Tôi vừa đưa ra mẫu mã ở đây, mã ban đầu thêm các phần tử động vào mảng .. Tôi đã chọn để thêm các phần tử vào mảng thay vì push(). Điều đó tạo ra nhiều sự khác biệt trong những gì tôi đang tìm kiếm? –

Trả lời

74

foo = [] tạo mảng mới và chỉ định tham chiếu đến biến đó thành biến. Bất kỳ tài liệu tham khảo khác không bị ảnh hưởng và vẫn trỏ đến mảng ban đầu.

foo.length = 0 sửa đổi chính mảng đó. Nếu bạn truy cập nó thông qua một biến khác, thì bạn vẫn nhận được mảng đã sửa đổi.

đã đọc ở đâu đó rằng một giây tạo ra một mảng mới bằng cách tiêu diệt tất cả các tham chiếu đến các mảng hiện

Đó là về phía sau. Nó tạo ra một mảng mới và không phá hủy các tham chiếu khác.

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); 

cho:

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

Nhưng, vẫn ... Sau khi đọc bài viết của bạn, tôi không hiểu tại sao nó giúp giải thích vấn đề này. Từ những gì tôi hiểu, 'arr' là một var toàn cục, và do đó tất cả các tham chiếu nên trỏ đến cùng một đối tượng. –

+0

Bạn đã cho OP những gì anh ta yêu cầu, nhưng không phải những gì anh ta cần. :) Đôi khi hai cái này không giống nhau. – galambalazs

+0

Cảm ơn David, nhưng tôi vẫn không hiểu tại sao mảng trong trường hợp trên không rỗng với độ dài = 0. Có cái gì để làm với việc tạo ra năng động của các yếu tố trong mảng. –

1

Sự khác biệt ở đây được thể hiện tốt nhất trong ví dụ sau:

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); 

Trong đó một bản demo sống có thể được nhìn thấy ở đây: http://www.jsfiddle.net/8Yn7e/

Khi bạn đặt một biến trỏ đến một mảng hiện có để trỏ đến một mảng mới, tất cả các bạn là d oing là phá vỡ liên kết biến có đến mảng ban đầu đó.

Khi bạn sử dụng array.length = 0 (và các phương pháp khác như array.splice(0, array.length) chẳng hạn), bạn đang thực sự đổ mảng gốc.

+0

Trình duyệt nào không Không hỗ trợ 'array.length = 0'? – user2013

+1

@ArthaeyAngosii: Heh, không có gì tôi biết. Rõ ràng tôi đã ngây thơ và rất thích trả lời với rác vào tháng 1 năm 2011 ... cảm ơn vì đã chỉ ra nó;). – Matt

0

Bạn có chắc nó thực sự hoạt động không?

Tôi đã làm một thử nghiệm nhỏ ở đây và cố gắng "thêm" một mảng bằng một chuỗi dẫn đến một chuỗi.

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

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

(thử nghiệm trong Opera 11)

Các vấn đề liên quan