Khi mảng được gán cho một biến khác, tham chiếu được truyền ngược với giá trị. Đây là khẳng định khi bạn so sánh hai mảng sử dụng ==
điều hành và nó trả true
Tôi thiếu gì với sự hiểu biết về mảng?
var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]
a == b; //true
a == c; //false
Với đầu vào ở trên, khi tôi thay đổi mảng b
, nó đột biến mảng a
, nhưng không c
.
b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]
Nhưng khi tôi làm như dưới đây, nó sẽ biến đổi c
.
b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]
Tại sao điều này xảy ra? Hành vi này xảy ra với việc sử dụng các phương thức mảng làm biến đổi mảng.
+1, đó là câu trả lời. Bạn có nghĩ rằng nó sẽ là tốt để bao gồm làm thế nào để làm cho * sâu * bản sao của một mảng (hoặc bất kỳ đối tượng khác)? (jQuery '.extend()' hoặc lodash '.deepClone()'?) – bardzusny
@bardzusny có rất nhiều câu trả lời trên stackoverflow rồi. – Leo
thanks nnnnnn, giải thích hành vi. Như @bardzusny đã thêm vào, ai đó có thể đề xuất bất kỳ phương thức hoặc thư viện được xây dựng nào có bản sao sâu của mảng không? – Harish