Sao chép đối tượng JavaScript

Nếu bạn đang làm việc với JavaScript, việc xử lý các Đối tượng luôn khó khăn. Là người mới bắt đầu với JS, tôi đã gặp rất nhiều thử thách với Object nhưng giờ tôi đã hiểu rõ hơn về điều này và tôi muốn chia sẻ với tất cả các bạn

Điều cơ bản cần hiểu ở đây là sự khác biệt giữa Loại nguyên thủy và Đối tượng. Các loại nguyên thủy như chuỗi, số, booleans, v.v. luôn được sao chép dưới dạng giá trị trong khi các Đối tượng khác khi chúng được sao chép và lưu trữ theo tham chiếu

Điều đó có nghĩa là gì?

let foo = "Hello String";
let bar = foo;
bar = "Bye String";
console.log[foo]; // "Hello String"

Bạn có thấy điều gì vừa xảy ra không?

Khi bạn gán foo cho thanh, nó sẽ tạo một bản sao riêng của toàn bộ giá trị. Vì vậy, khi chúng tôi gán một giá trị mới cho thanh, nó không ảnh hưởng đến giá trị foo vì các nguyên hàm không sử dụng tham chiếu

Trong khi nó hoàn toàn khác với Object

Đối tượng là loại tham chiếu

Một biến được gán cho một kho lưu trữ đối tượng, không phải chính đối tượng đó, mà là “địa chỉ trong bộ nhớ” của nó — nói cách khác, “một tham chiếu” đến nó

Hãy hiểu nó bằng ví dụ

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce

Như bạn có thể thấy, chỉ có một đối tượng ở đây với hai tham chiếu trỏ đến nó. Vì vậy, sao chép một biến đối tượng sẽ tạo thêm một tham chiếu đến cùng một đối tượng

Nhưng nếu chúng ta cần sao chép một đối tượng thì sao? . Hãy xem 3 cách chúng ta có thể sao chép Đối tượng

Sử dụng cú pháp Spread […]

Toán tử trải rộng nhân bản một đối tượng với các thuộc tính của nó. Hãy ghi nhớ là một bản sao nông, có nghĩa là chỉ các trường nguyên thủy cấp đầu tiên được sao chép theo giá trị và phần còn lại của các đối tượng lồng nhau được sao chép theo tham chiếu

const dishes = { chicken: '🍗', pizza: '🍕' };
const cloneDish = { ...dishes };
console.log[cloneDish];
// { chicken: '🍗', pizza: '🍕' }

Sử dụng đối tượng. phương thức gán[]

đối tượng. Phương thức gán [] được sử dụng để sao chép các giá trị của tất cả các thuộc tính riêng có thể đếm được từ một hoặc nhiều đối tượng nguồn sang đối tượng đích

let obj = { a: 1, b: 2, };
let objCopy = Object.assign[{}, obj];
console.log[objCopy];
// Result - { a: 1, b: 2 }

Cú pháp và đối tượng của Spread […]. gán có một vấn đề là họ chỉ thực hiện một bản sao nông. Điều đó có nghĩa là các thuộc tính lồng nhau vẫn sẽ được sao chép theo tham chiếu. Hãy cẩn thận khi sử dụng chúng

Đối tượng sao chép sâu

Một bản sao sâu sẽ sao chép mọi đối tượng mà nó gặp phải. Bản sao và đối tượng gốc sẽ không chia sẻ bất cứ thứ gì, vì vậy nó sẽ là bản sao của bản gốc. Điều này khắc phục sự cố mà chúng tôi gặp phải trong hai phương pháp trên

Sử dụng JSON. phân tích cú pháp [JSON. xâu chuỗi [đối tượng]]

let obj = 
{
foo: 1,
bar: {
foobar: 2,
}
}
let newObj = JSON.parse[JSON.stringify[obj]];obj.bar.foobar = 20;
console.log[obj];
// { foo: 1, bar: { foobar: 20 } }
console.log[newObj];
//{ foo: 1, bar: { foobar: 2 }} [New Object with Original Values]

Phương pháp này có một số cạm bẫy. Nó không thể được sử dụng để sao chép các phương thức đối tượng do người dùng xác định và bạn phải đảm bảo rằng đối tượng nguồn là JSON an toàn

Sử dụng _. phương thức cloneDeep[]

Các _. phương thức cloneDeep[] được sử dụng để tạo một bản sao sâu của giá trị i. e. nó sao chép đệ quy giá trị

const _ = require['lodash'];
var obj = { x: 23 };
var deepCopy = _.cloneDeep[obj];
obj.x = 10; // Changing original value
console.log[obj.x]; //10
console.log[deepCopy]; //23

Vì đây là một bản sao sâu, bạn sẽ không có bất kỳ dấu vết nào đối với Đối tượng gốc

Phần kết luận

Sao chép các đối tượng trong JS có thể phức tạp, đặc biệt nếu bạn chưa quen với Javascript. Hy vọng rằng, bài viết này đã giúp bạn hiểu cách làm việc và tránh các vấn đề mà bạn có thể gặp phải sau này. Nếu bạn có bất kỳ đề xuất nào hoặc bất kỳ cách nào tốt hơn để đạt được điều này, vui lòng chỉ ra và tôi sẽ cập nhật nó. mã hóa hạnh phúc

Trong bài viết này, bạn sẽ tìm hiểu sao chép nông và sâu là gì, cũng như cách tốt nhất để sao chép sâu một đối tượng trong JavaScript

Sao chép nông vs. Sao chép sâu

Trong thao tác gán lại liên quan đến các kiểu dữ liệu nguyên thủy như chuỗi, số và booleans, biến ban đầu được sao chép bởi JavaScript.  

Ví dụ: xem xét đoạn mã sau

1
let x = 3
2
y = x //  x is copied into y

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
2
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
5
let x = 3
0
let x = 3
1

Trong trường hợp này, giá trị

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
031 được sao chép vào
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
032, sau đó
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
033 bị ngắt kết nối khỏi
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
032. Vì vậy, đột biến
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
032 không ảnh hưởng đến
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
033

Ngược lại, với các kiểu dữ liệu không nguyên thủy như mảng và đối tượng, chỉ một tham chiếu đến các giá trị được truyền. Vì vậy, khi bản sao bị biến đổi, bản gốc cũng bị biến đổi. Điều này còn được gọi là sao chép nông

1
let x = 3
3
2
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
let x = 3
6
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
8
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
2
1
let x = 3
0
2
3

Thay vào đó, nếu chúng ta muốn sao chép một đối tượng để có thể sửa đổi nó mà không ảnh hưởng đến đối tượng ban đầu, chúng ta cần tạo một bản sao sâu.  

5 cách để sao chép sâu các đối tượng trong JavaScript

Trong JavaScript, chúng ta có thể thực hiện sao chép đối tượng bằng các phương thức sau

MethodProsConssao chép nông với
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
037rõ ràng và trực tiếp, mặc định chỉ sao chép nông các đối tượng
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
038 và
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
039sao chép sâu các đối tượng lồng nhau không sao chép chức năngObject. gán[] sao chép các thành viên trực tiếp của một đối tượng—bao gồm các hàm không sao chép sâu các đối tượng lồng nhaucác toán tử trải rộng
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
040 cú pháp đơn giản, cách ưa thích để sao chép một đối tượng không sao chép sâu các đối tượng lồng nhauLodash
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
041sao chép các đối tượng lồng nhau bao gồm các hàmthêm một phụ thuộc bên ngoài vào dự án của bạn

Các phương pháp này đều có ưu và nhược điểm. Chúng ta hãy xem xét kỹ hơn từng người trong số họ

Sao chép nông một đối tượng theo nhiệm vụ

Bạn có thể tạo một bản sao nông của một đối tượng bằng cách gán đối tượng ban đầu cho một biến mới.  

Xét đối tượng sau

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
y = x //  x is copied into y

1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
y = x //  x is copied into y

3

Để tạo một bản sao của đối tượng

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
042, chúng ta gán đối tượng cho một biến mới như vậy

1
y = x //  x is copied into y

5___

Theo quan sát trong đầu ra của bảng điều khiển, chúng tôi hiện đã sao chép đối tượng từ

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
042 sang
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
044

Tuy nhiên, tất cả những gì chúng ta đã làm là tạo một tham chiếu đến đối tượng ban đầu. Bất cứ khi nào chúng ta thay đổi một thuộc tính trong đối tượng

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
044, cuối cùng chúng ta cũng sẽ thay đổi đối tượng ban đầu [
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
042] như chúng ta làm trong đoạn mã sau

Các

Vì vậy, khi một kiểu dữ liệu không nguyên thủy [mảng hoặc đối tượng] được gán cho một biến mới, JavaScript sẽ tạo một bản sao nông của đối tượng ban đầu

Sao chép đối tượng bằng
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
038 và
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
039

Phương thức

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
038 nhận một đối tượng và tạo một chuỗi JSON từ nó. Phương thức
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
039 phân tích cú pháp một chuỗi và trả về một đối tượng JavaScript

Chúng ta có thể kết hợp cả hai phương pháp này để tạo một bản sao của đối tượng theo cách sau

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
y = x //  x is copied into y

1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
y = x //  x is copied into y

3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let x = 3
0
let x = 3
12
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
y = x //  x is copied into y

8
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
00
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
12
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
14
let x = 3
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
16
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
18
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
07
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
22
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
24
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
26
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let x = 3
33
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
07
let x = 3
35
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let x = 3
37
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
let x = 3
39
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let x = 3
41
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
27

Khi đối tượng sao chép bị thay đổi, đối tượng ban đầu vẫn giữ nguyên

1
let x = 3
444___

Tuy nhiên, có một lưu ý khi sử dụng phương pháp này.

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
038 không sao chép chức năng

Giả sử chúng ta có một phương thức trong đối tượng

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
042 được gọi là
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
053

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
82
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let x = 3
84
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let x = 3
86
let x = 3
0
let x = 3
88
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
y = x //  x is copied into y

3

Chức năng sẽ không khả dụng trong đối tượng được sao chép. Do đó, phương pháp này chỉ đạt được bản sao sâu nếu không có chức năng nào trong đối tượng

Sao chép đối tượng bằng
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054

Trước ES6,

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054 là cách phổ biến nhất để sao chép sâu một đối tượng

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
82
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let x = 3
84
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let x = 3
86
let x = 3
0
let x = 3
88
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
y = x //  x is copied into y

3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
2
09

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054 sẽ sao chép mọi thứ vào đối tượng mới, bao gồm mọi chức năng. Thay đổi đối tượng được sao chép cũng không ảnh hưởng đến đối tượng ban đầu

1
let x = 3
44
2
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
y = x //  x is copied into y

8
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
00
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let x = 3
20
let x = 3
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
2
23
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
2
25
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
2
27
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
12
2
29
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
14
2
31
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
16
2
33
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
18
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
22
2
39
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
24
2
25
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
26
2
27
let x = 3
33
2
29
let x = 3
35
2
31
let x = 3
37
2
33
let x = 3
39
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let x = 3
41
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
27

Tuy nhiên, một điều cần nhớ về

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054 là phương thức này chỉ thực hiện sao chép sâu một phần đối tượng

Để hiểu điều đó có nghĩa là gì, chúng ta hãy xem xét những điều sau đây

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
82
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
2
63
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
2
65
let x = 3
0
let x = 3
88
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
y = x //  x is copied into y

3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
2
72

Theo quan sát, chúng tôi đã thêm thuộc tính vị trí và chuyển một đối tượng làm giá trị của nó. Bây giờ chúng ta có một cấu trúc phức tạp hơn chứa đối tượng lồng nhau.  

Bất cứ khi nào chúng ta thay đổi một thuộc tính trong đối tượng lồng nhau [trong

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
044], nó cũng sẽ thay đổi thuộc tính tương tự trong đối tượng ban đầu [
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
059]. chúng ta hãy xem

1
let x = 3
44
2
2
76
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
y = x //  x is copied into y

8
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
00
let x = 3
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
let x = 3
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
07
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
12
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
14
2
93
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
16
2
95
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
18
2
97
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
22
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
24
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
15
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
26
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let x = 3
33
let x = 3
66
let x = 3
35
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let x = 3
37
2
93
let x = 3
39
2
95
let x = 3
41
2
97
y = x //  x is copied into y

16
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
y = x //  x is copied into y

18
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
y = x //  x is copied into y

20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
27

Mặc dù thuộc tính

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
060 trong đối tượng ban đầu vẫn không bị ảnh hưởng, nhưng thuộc tính
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
061 đã bị thay đổi do thao tác chỉ định lại

Do đó, nên sử dụng phương thức

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054 để sao chép sâu các đối tượng không có đối tượng lồng nhau.  

Cách tốt nhất để sao chép sâu trong JavaScript. Toán tử lây lan

Một cách khác để sao chép sâu các đối tượng trong JavaScript là sử dụng toán tử trải rộng ES6. Sử dụng dấu ba chấm [

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
040] thu thập tất cả các giá trị trên đối tượng ban đầu vào một đối tượng khác

1
2
5
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
y = x //  x is copied into y

1
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
y = x //  x is copied into y

3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let x = 3
0
y = x //  x is copied into y

34
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
y = x //  x is copied into y

37
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
12
let x = 3
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
14
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
16
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
07
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
18
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
20__
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
112_____122_____1

Tuy nhiên, giống như với

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
054, toán tử trải rộng chỉ tạo một bản sao một phần. Vì vậy, bất kỳ đối tượng nào có đối tượng lồng nhau sẽ không được sao chép sâu

Để tạo một bản sao sâu hoàn chỉnh với toán tử trải rộng, chúng ta sẽ phải viết một số mã bổ sung

Xem xét cùng một đối tượng người dùng nhưng với một đối tượng lồng nhau

1
y = x //  x is copied into y

54
2
2
7
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
2
9
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
82
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
2
63
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
y = x //  x is copied into y

64
let x = 3
0
let x = 3
88
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
y = x //  x is copied into y

3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
y = x //  x is copied into y

71

Để tránh làm thay đổi đối tượng ban đầu, đó là

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
042, chúng ta phải trải rộng đối tượng sao chép trước khi thực hiện các thay đổi trực tiếp đối với bất kỳ thuộc tính nào của nó. Đối với bất kỳ đối tượng lồng nhau nào, chúng ta cũng phải trải rộng đối tượng con đó trước khi thực hiện thay đổi đối với bất kỳ thuộc tính nào của nó

1
y = x //  x is copied into y

73
2
y = x //  x is copied into y

75
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
y = x //  x is copied into y

77
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
y = x //  x is copied into y

79
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
y = x //  x is copied into y

81
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
y = x //  x is copied into y

83
let x = 3
0
y = x //  x is copied into y

85
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
y = x //  x is copied into y

3

Ở đây, chúng tôi đã biến đổi

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
060, là thuộc tính cấp cao nhất trong
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
044 và
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
061, là thuộc tính phụ

Lần này, thao tác trải rộng sẽ tạo ra một bản sao sâu hoàn chỉnh trong đó đối tượng ban đầu sẽ không bị ảnh hưởng bởi bất kỳ đột biến nào trên bản sao [

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
044]

1
y = x //  x is copied into y

8
2
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
00
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
1
let x = 3
20
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
3
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
4
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
07
let x = 3
0
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
06
2
93
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
08
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
004
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
10
2
97
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
12
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
14
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
16
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
15
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
18
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
05
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
20
let x = 3
66
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
22
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
09
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
24
2
93
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
26
2
95
let x = 3
33
2
97
let x = 3
35
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
11
let x = 3
37
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
13
let x = 3
39
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
27

Sử dụng Lodash
let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
041 để sao chép sâu

Lodash cũng cung cấp một phương thức tiện ích

let person = { name: 'Sarfraz' };
let person2 = person;
person.name = 'John';
console.log[person2.name]; // "John" changes from person refernce
071 để sao chép sâu các đối tượng trong JavaScript. Đọc thêm về phương pháp

Phần kết luận

Như bạn đã thấy, có một số cách để sao chép một biến trong JavaScript. Không có phương pháp nào là hoàn hảo cho mọi trường hợp, vì vậy bạn sẽ phải cẩn thận để chọn phương pháp tốt nhất cho từng tình huống

Bạn có thể sao chép một đối tượng?

Có một số cách để sao chép một đối tượng, phổ biến nhất là bằng một trình tạo bản sao hoặc nhân bản . Sao chép được thực hiện chủ yếu để bản sao có thể được sửa đổi hoặc di chuyển hoặc giữ nguyên giá trị hiện tại. Nếu một trong hai điều này là không cần thiết, thì việc tham chiếu đến dữ liệu gốc là đủ và hiệu quả hơn vì không xảy ra sao chép.

Làm cách nào để sao chép một đối tượng vào một đối tượng khác trong JavaScript?

var clone = Đối tượng. gán[{}, obj]; . Phương thức gán [] được sử dụng để sao chép các giá trị của tất cả các thuộc tính riêng có thể đếm được từ một hoặc nhiều đối tượng nguồn sang đối tượng đích

Làm cách nào để sao chép đối tượng tệp trong JavaScript?

phương thức gán[] . đối tượng. Phương thức gán [] được sử dụng để sao chép các giá trị của tất cả các thuộc tính riêng có thể đếm được từ một hoặc nhiều đối tượng nguồn sang đối tượng đích.

Toán tử nào được sử dụng để sao chép một đối tượng trong JavaScript?

assign[] Một cách thay thế cho toán tử trải rộng là Đối tượng. phương thức gán[]. Bạn sử dụng phương thức này để sao chép các giá trị và thuộc tính từ một hoặc nhiều đối tượng nguồn sang đối tượng đích.

Chủ Đề