2013-06-06 41 views
20

Đó là về thực hành tốt nhất khi bạn cần phải sao chép đối tượng trong javascript ..Sự khác nhau giữa dấu gạch dưới gạch dưới() và đơn giản '=' là gì?

Ví dụ:

tôi có một đối tượng { name: 'Dodo', method: function() { console.log(this.name) }};

tôi cần phải tạo ra một bản sao của nó:

var obj = { name: 'Dodo', method: function() { console.log(this.name) } }; 
// what is better? 
var copyUnderscore = _(obj).clone(); 
var copySimple = obj; 

cách tốt hơn là gì? Cảm ơn!

+5

Họ làm những việc khác nhau, vì vậy nó phải là khá rõ ràng. Hay bạn không hiểu sự khác biệt? – Bergi

+1

'simpleCopy' chỉ giữ tham chiếu. –

+0

@Bergi có vẻ như tôi hiểu nhưng tôi chỉ cần một bí danh khác .. trong trường hợp của tôi thậm chí còn phức tạp hơn tôi có '' obj.objChild'' và tôi muốn gán '' obj.childAlias ​​= obj.objChild'', mọi thứ hoạt động tốt , nhưng tôi chỉ đơn giản muốn biết nếu nó tốt – Kosmetika

Trả lời

77

_.clone hoàn toàn khác với nhiệm vụ.

_.clone tạo đối tượng mới và sao chép từng giá trị từ gốc sang đối tượng mới.

Bài tập chỉ trỏ một biến vào đối tượng đã tồn tại.

Giả sử bạn có con chó con. Hãy gọi anh ta Rex.

Nếu bạn đang thảo luận Rex với người nào đó, bạn sẽ gọi anh ấy là Rex hoặc có thể là "Chó". Cả hai đều là những tham chiếu đến con vật được đề cập. Một bài tập tương tự như sử dụng cụm từ khác nhau cho thú cưng của bạn:

rex = { 
 
    type: 'Dog', 
 
    age: '12 Weeks', 
 
    name: "Rex", 
 
    fixed: false, 
 
    fix: function() { 
 
    this.fixed = true; 
 
    console.log(this.name + " Fixed."); 
 
    } 
 
}; 
 
theDog = rex; 
 

 
// Note the use of `===`, which checks for object identity. 
 
// Assignment (as above) is the whole point of `===` 
 
if (theDog === rex) { 
 
    alert("The Dog is the Same as Rex"); 
 
}

Khi bạn thay đổi điều gì đó về một, nó thay đổi cho cả hai tài liệu tham khảo. Vì vậy, giả sử bạn "sửa chữa" Rex:

rex = { 
 
    type: 'Dog', 
 
    age: '12 Weeks', 
 
    name: "Rex", 
 
    fixed: false, 
 
    fix: function() { 
 
    this.fixed = true; 
 
    console.log(this.name + " Fixed."); 
 
    } 
 
}; 
 
theDog = rex; 
 
rex.fix(); 
 

 
alert("The Dog is " + (theDog.fixed ? "" : "not ") + "fixed"); 
 
alert("Rex is " + (rex.fixed ? "" : "not ") + "fixed");

theDog cũng là cố định.

Bây giờ giả sử bạn đã nhân bản Rex. (Hãy giả vờ là anh ta không cố định vì lợi ích của cuộc tranh luận).

rex = { 
 
    type: 'Dog', 
 
    age: '12 Weeks', 
 
    name: "Rex", 
 
    fixed: false, 
 
    fix: function() { 
 
    this.fixed = true; 
 
    console.log(this.name + " Fixed."); 
 
    } 
 
}; 
 
theDog = rex; 
 
otherDog = _.clone(rex); 
 

 
console.log(theDog); 
 
console.log(rex); 
 
console.log(otherDog); 
 

 
var message = rex === theDog ? "Rex is the same as the dog" : "Rex and the dog are different"; 
 
message += "\n"; 
 
message += rex === otherDog ? "Rex is the same as the other dog" : "Rex is different from the other dog"; 
 
message += "\n"; 
 
message += rex.fixed ? "Rex is fixed" : "Rex is not fixed"; 
 
message += "\n"; 
 
message += otherDog.fixed ? "Other dog is fixed" : "Other dog is not fixed"; 
 

 
alert(message); 
 

 
otherDog.fix(); 
 

 
message = rex.fixed ? "Rex is fixed" : "Rex is not fixed"; 
 
message += "\n"; 
 
message += otherDog.fixed ? "Other dog is fixed" : "Other dog is not fixed"; 
 
alert(message);
<script src="http://underscorejs.org/underscore-min.js"></script>

Mỗi giá trị từ rex đã được sao chép vào otherDog. Một cách kỳ diệu, "otherDog" được sinh ra ở tuổi 12 tuần. Nhưng sửa chữa một cái sẽ không phải sửa lỗi kia.

Bây giờ, kể từ rextheDog là cùng một con chó, không cố định. Tuy nhiên, otherDog cố định. Ông là một bản sao, không phải cùng một con vật.

Có một số sự tinh tế cần lưu ý. _.clone không sao chép sâu. Điều này có nghĩa là bất kỳ đối tượng hoặc mảng nào là giá trị trong đối tượng nhân bản được sao chép bằng cách gán gán cho đối tượng mới (Xem đoạn đầu tiên để xem lại ý nghĩa của điều đó).

Điều này có nghĩa là nếu rex có thuộc tính mother là đối tượng đại diện cho mẹ của mình, nó sẽ được chia sẻ giữa rexotherDog. Mọi thay đổi đối với mẹ của rex sẽ được phổ biến đến otherDog. Điều này không khác với cuộc sống thực; người mẹ sinh học là một và giống nhau.

EDIT

Như một nốt kỳ diệu: nhân bản một con chó cố định tạo ra một con chó cố định. Đây là nơi ẩn dụ sinh học bị phá vỡ.

+0

cảm ơn Christopher, câu trả lời xuất sắc;) – Kosmetika

+8

tài liệu tham khảo và con trỏ rất phức tạp. Đừng nản chí, chỉ cần tìm những điểm tương đồng trong cuộc sống thực cho đến khi bạn nhận được nó ... nó có thể mất một lúc, nhưng nó cực kỳ quan trọng. Làm tốt công nhận bạn không hiểu sự khác biệt. – Crisfole

+5

Đừng quên ['underscore.clone (obj)'] (http://underscorejs.org/#clone) chỉ cung cấp cho bạn một bản sao nông –

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