From 89be6c8e43790bc77b649e5a6b0518b231b6e822 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:18:47 +0700 Subject: [PATCH 01/28] Update article.md --- .../02-object-copy/article.md | 157 +++++++++--------- 1 file changed, 79 insertions(+), 78 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index cafb71cac..8e32133fb 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -1,29 +1,29 @@ -# Object references and copying +# Tham chiếu và sao chép đối tượng -One of the fundamental differences of objects versus primitives is that objects are stored and copied "by reference", whereas primitive values: strings, numbers, booleans, etc -- are always copied "as a whole value". +Một trong những điểm khác biệt cơ bản của đối tượng so với đối tượng nguyên thủy là đối tượng được lưu trữ và sao chép "theo tham chiếu", trong khi các giá trị nguyên thủy: chuỗi, số, booleans, v.v. -- luôn được sao chép "dưới dạng toàn bộ giá trị". -That's easy to understand if we look a bit under the hood of what happens when we copy a value. +Điều đó dễ hiểu nếu chúng ta xem xét một chút về những gì xảy ra khi chúng ta sao chép một giá trị. -Let's start with a primitive, such as a string. +Hãy bắt đầu với một nguyên hàm, chẳng hạn như một chuỗi. -Here we put a copy of `message` into `phrase`: +Ở đây chúng ta đặt một bản sao của `message` vào `phrase`: ```js -let message = "Hello!"; +let message = "Xin chào!"; let phrase = message; ``` -As a result we have two independent variables, each one storing the string `"Hello!"`. +Kết quả là chúng ta có hai biến độc lập, mỗi biến lưu trữ chuỗi `"Xin chào!"`. ![](variable-copy-value.svg) -Quite an obvious result, right? +Một kết quả khá rõ ràng, phải không? -Objects are not like that. +Đối tượng không phải như vậy. -**A variable assigned to an object stores not the object itself, but its "address in memory" -- in other words "a reference" to it.** +**Một biến được gán cho một đối tượng không lưu trữ chính đối tượng đó, mà lưu trữ "địa chỉ trong bộ nhớ" của đối tượng -- nói cách khác là "tham chiếu" tới đối tượng đó.** -Let's look at an example of such a variable: +Hãy xem một ví dụ về một biến như vậy: ```js let user = { @@ -31,35 +31,35 @@ let user = { }; ``` -And here's how it's actually stored in memory: +Và đây là cách nó thực sự được lưu trữ trong bộ nhớ: ![](variable-contains-reference.svg) -The object is stored somewhere in memory (at the right of the picture), while the `user` variable (at the left) has a "reference" to it. +Đối tượng được lưu trữ ở đâu đó trong bộ nhớ (ở bên phải của hình ảnh), trong khi biến `user` (ở bên trái) có "tham chiếu" đến nó. -We may think of an object variable, such as `user`, as like a sheet of paper with the address of the object on it. +Chúng ta có thể nghĩ về một biến đối tượng, chẳng hạn như `người dùng`, giống như một tờ giấy có địa chỉ của đối tượng trên đó. -When we perform actions with the object, e.g. take a property `user.name`, the JavaScript engine looks at what's at that address and performs the operation on the actual object. +Khi chúng ta thực hiện các hành động với đối tượng, v.d. lấy một thuộc tính `user.name`, JavaScript engine sẽ xem xét địa chỉ đó có gì và thực hiện thao tác trên đối tượng thực tế. -Now here's why it's important. +Bây giờ đây là lý do tại sao nó quan trọng. -**When an object variable is copied, the reference is copied, but the object itself is not duplicated.** +**Khi một biến đối tượng được sao chép, tham chiếu được sao chép nhưng bản thân đối tượng không được sao chép.** -For instance: +Ví dụ: ```js no-beautify let user = { name: "John" }; -let admin = user; // copy the reference +let admin = user; // sao chép tham chiếu ``` -Now we have two variables, each storing a reference to the same object: +Bây giờ chúng ta có hai biến, mỗi biến lưu trữ một tham chiếu đến cùng một đối tượng: ![](variable-copy-reference.svg) -As you can see, there's still one object, but now with two variables that reference it. +Như bạn có thể thấy, vẫn còn một đối tượng, nhưng bây giờ có hai biến tham chiếu đến nó. -We can use either variable to access the object and modify its contents: +Chúng ta có thể sử dụng một trong hai biến để truy cập đối tượng và sửa đổi nội dung của nó: ```js run let user = { name: 'John' }; @@ -67,50 +67,50 @@ let user = { name: 'John' }; let admin = user; *!* -admin.name = 'Pete'; // changed by the "admin" reference +admin.name = 'Pete'; // được thay đổi bởi tham chiếu "admin" */!* -alert(*!*user.name*/!*); // 'Pete', changes are seen from the "user" reference +alert(*!*user.name*/!*); // 'Pete', những thay đổi được nhìn thấy từ tham chiếu "user" ``` -It's as if we had a cabinet with two keys and used one of them (`admin`) to get into it and make changes. Then, if we later use another key (`user`), we are still opening the same cabinet and can access the changed contents. +Giống như thể chúng ta có một chiếc tủ có hai chìa khóa và sử dụng một trong số chúng (`admin`) để mở và thực hiện các thay đổi. Sau đó, nếu sau này chúng ta sử dụng một khóa khác (`user`), thì chúng ta vẫn đang mở cùng một ngăn tủ và có thể truy cập vào nội dung đã thay đổi. -## Comparison by reference +## So sánh theo tham chiếu -Two objects are equal only if they are the same object. +Hai đối tượng chỉ bằng nhau nếu chúng là cùng một đối tượng. -For instance, here `a` and `b` reference the same object, thus they are equal: +Chẳng hạn, ở đây `a` và `b` tham chiếu cùng một đối tượng, do đó chúng bằng nhau: ```js run let a = {}; -let b = a; // copy the reference +let b = a; // sao chép tham chiếu -alert( a == b ); // true, both variables reference the same object +alert( a == b ); // true, cả hai biến tham chiếu cùng một đối tượng alert( a === b ); // true ``` -And here two independent objects are not equal, even though they look alike (both are empty): +Và ở đây, hai đối tượng độc lập không bằng nhau, mặc dù chúng trông giống nhau (cả hai đều trống): ```js run let a = {}; -let b = {}; // two independent objects +let b = {}; // hai đối tượng độc lập alert( a == b ); // false ``` -For comparisons like `obj1 > obj2` or for a comparison against a primitive `obj == 5`, objects are converted to primitives. We'll study how object conversions work very soon, but to tell the truth, such comparisons are needed very rarely -- usually they appear as a result of a programming mistake. +Đối với các so sánh như `obj1 > obj2` hoặc để so sánh với một đối tượng nguyên thủy `obj == 5`, các đối tượng được chuyển đổi thành đối tượng nguyên thủy. Chúng ta sẽ sớm nghiên cứu cách hoạt động của chuyển đổi đối tượng, nhưng nói thật, những phép so sánh như vậy rất hiếm khi cần thiết -- chúng thường xuất hiện do lỗi lập trình. -## Cloning and merging, Object.assign [#cloning-and-merging-object-assign] +## Nhân bản và hợp nhất, Object.assign [#cloning-and-merging-object-assign] -So, copying an object variable creates one more reference to the same object. +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. -But what if we need to duplicate an object? Create an independent copy, a clone? +Nhưng nếu chúng ta cần sao chép một đối tượng thì sao? Tạo một bản sao độc lập, một bản sao? -That's also doable, but a little bit more difficult, because there's no built-in method for that in JavaScript. But there is rarely a need -- copying by reference is good most of the time. +Điều đó cũng có thể thực hiện được, nhưng hơi khó hơn một chút vì không có phương thức tích hợp sẵn nào cho điều đó trong JavaScript. Nhưng hiếm khi có nhu cầu - hầu hết thời gian sao chép theo tham chiếu là tốt. -But if we really want that, then we need to create a new object and replicate the structure of the existing one by iterating over its properties and copying them on the primitive level. +Nhưng nếu chúng ta thực sự muốn điều đó, thì chúng ta cần tạo một đối tượng mới và sao chép cấu trúc của đối tượng hiện có bằng cách lặp lại các thuộc tính của nó và sao chép chúng ở cấp độ nguyên thủy. -Like this: +Như thế này: ```js run let user = { @@ -119,34 +119,34 @@ let user = { }; *!* -let clone = {}; // the new empty object +let clone = {}; // đối tượng trống mới -// let's copy all user properties into it +// hãy sao chép tất cả các thuộc tính người dùng vào đó for (let key in user) { clone[key] = user[key]; } */!* -// now clone is a fully independent object with the same content -clone.name = "Pete"; // changed the data in it +// bây giờ bản sao là một đối tượng hoàn toàn độc lập với cùng một nội dung +clone.name = "Pete"; // đã thay đổi dữ liệu trong đó -alert( user.name ); // still John in the original object +alert( user.name ); // vẫn còn John trong đối tượng ban đầu ``` -Also we can use the method [Object.assign](mdn:js/Object/assign) for that. +Ngoài ra, chúng ta có thể sử dụng phương thức [Object.assign](mdn:js/Object/assign) cho việc đó. -The syntax is: +Cú pháp là: ```js Object.assign(dest, [src1, src2, src3...]) ``` -- The first argument `dest` is a target object. -- Further arguments `src1, ..., srcN` (can be as many as needed) are source objects. -- It copies the properties of all source objects `src1, ..., srcN` into the target `dest`. In other words, properties of all arguments starting from the second are copied into the first object. -- The call returns `dest`. +- Đối số đầu tiên `dest` là một đối tượng đích. +- Các đối số khác `src1, ..., srcN` (có thể bao nhiêu tùy ý) là các đối tượng nguồn. +- Nó sao chép các thuộc tính của tất cả các đối tượng nguồn `src1, ..., srcN` vào đích `dest`. Nói cách khác, các thuộc tính của tất cả các đối số bắt đầu từ đối số thứ hai được sao chép vào đối tượng đầu tiên. +- Cuộc gọi trả về `dest`. -For instance, we can use it to merge several objects into one: +Chẳng hạn, chúng ta có thể sử dụng nó để hợp nhất nhiều đối tượng thành một: ```js let user = { name: "John" }; @@ -154,14 +154,14 @@ let permissions1 = { canView: true }; let permissions2 = { canEdit: true }; *!* -// copies all properties from permissions1 and permissions2 into user +// sao chép tất cả các thuộc tính từ permissions1 và permission2 vào user Object.assign(user, permissions1, permissions2); */!* -// now user = { name: "John", canView: true, canEdit: true } +// bây giờ người dùng = { name: "John", canView: true, canEdit: true } ``` -If the copied property name already exists, it gets overwritten: +Nếu tên thuộc tính được sao chép đã tồn tại, nó sẽ bị ghi đè: ```js run let user = { name: "John" }; @@ -171,7 +171,7 @@ Object.assign(user, { name: "Pete" }); alert(user.name); // now user = { name: "Pete" } ``` -We also can use `Object.assign` to replace `for..in` loop for simple cloning: +Chúng ta cũng có thể sử dụng `Object.assign` để thay thế vòng lặp `for..in` để sao chép đơn giản: ```js let user = { @@ -184,15 +184,16 @@ let clone = Object.assign({}, user); */!* ``` -It copies all properties of `user` into the empty object and returns it. +Nó sao chép tất cả các thuộc tính của `user` vào đối tượng trống và trả về nó. -There are also other methods of cloning an object, e.g. using the [spread syntax](info:rest-parameters-spread) `clone = {...user}`, covered later in the tutorial. +Ngoài ra còn có các phương pháp nhân bản đối tượng khác, ví dụ: sử dụng [cú pháp trải rộng](info:rest-parameters-spread) `clone = {...user}`, sẽ được trình bày sau trong hướng dẫn. -## Nested cloning +## Nhân bản lồng nhau -Until now we assumed that all properties of `user` are primitive. But properties can be references to other objects. What to do with them? +Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `người dùng` là nguyên thủy. Nhưng các thuộc tính có thể là tham chiếu đến các +đối tượng khác. Làm gì với chúng đây? -Like this: +Như thế này: ```js run let user = { name: "John", @@ -205,9 +206,9 @@ let user = { alert( user.sizes.height ); // 182 ``` -Now it's not enough to copy `clone.sizes = user.sizes`, because the `user.sizes` is an object, it will be copied by reference. So `clone` and `user` will share the same sizes: +Bây giờ sao chép `clone.sizes = user.sizes` là không đủ, vì `user.sizes` là một đối tượng, nó sẽ được sao chép theo tham chiếu. Vì vậy, `clone` và `user` sẽ có cùng kích thước: -Like this: +Như thế này: ```js run let user = { @@ -220,21 +221,21 @@ let user = { let clone = Object.assign({}, user); -alert( user.sizes === clone.sizes ); // true, same object +alert( user.sizes === clone.sizes ); // true, cùng một đối tượng -// user and clone share sizes -user.sizes.width++; // change a property from one place -alert(clone.sizes.width); // 51, see the result from the other one +// người dùng và bản sao chia sẻ kích thước +user.sizes.width++; // thay đổi một thuộc tính từ một nơi +alert(clone.sizes.width); // 51, xem kết quả từ một cái khác ``` -To fix that, we should use a cloning loop that examines each value of `user[key]` and, if it's an object, then replicate its structure as well. That is called a "deep cloning". +Để khắc phục điều đó, chúng ta nên sử dụng một vòng lặp nhân bản để kiểm tra từng giá trị của `user[key]` và nếu đó là một đối tượng thì cũng sao chép cấu trúc của nó. Đó được gọi là "nhân bản sâu". -We can use recursion to implement it. Or, to not reinvent the wheel, take an existing implementation, for instance [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) from the JavaScript library [lodash](https://lodash.com). +Chúng ta có thể sử dụng đệ quy để thực hiện nó. Hoặc, để không phát minh lại bánh xe, hãy thực hiện triển khai hiện có, chẳng hạn như [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) từ thư viện JavaScript [lodash](https://lodash. com). -````smart header="Const objects can be modified" -An important side effect of storing objects as references is that an object declared as `const` *can* be modified. +````smart header="Các đối tượng const có thể được sửa đổi" +Một tác dụng phụ quan trọng của việc lưu trữ các đối tượng dưới dạng tham chiếu là một đối tượng được khai báo là `const` *có thể* được sửa đổi. -For instance: +Ví dụ: ```js run const user = { @@ -248,17 +249,17 @@ user.name = "Pete"; // (*) alert(user.name); // Pete ``` -It might seem that the line `(*)` would cause an error, but it does not. The value of `user` is constant, it must always reference the same object, but properties of that object are free to change. +Có vẻ như dòng `(*)` sẽ gây ra lỗi, nhưng không phải vậy. Giá trị của `user` là hằng số, nó phải luôn tham chiếu cùng một đối tượng, nhưng các thuộc tính của đối tượng đó có thể tự do thay đổi. -In other words, the `const user` gives an error only if we try to set `user=...` as a whole. +Nói cách khác, `const user` chỉ báo lỗi nếu chúng ta cố gắng đặt toàn bộ `user=...`. -That said, if we really need to make constant object properties, it's also possible, but using totally different methods. We'll mention that in the chapter . +Điều đó nói rằng, nếu chúng ta thực sự cần tạo các thuộc tính đối tượng không đổi, thì cũng có thể, nhưng sử dụng các phương thức hoàn toàn khác. Chúng tôi sẽ đề cập đến điều đó trong chương . ```` -## Summary +## Tóm tắt -Objects are assigned and copied by reference. In other words, a variable stores not the "object value", but a "reference" (address in memory) for the value. So copying such a variable or passing it as a function argument copies that reference, not the object itself. +Các đối tượng được gán và sao chép theo tham chiếu. Nói cách khác, một biến không lưu trữ "giá trị đối tượng", mà là "tham chiếu" (địa chỉ trong bộ nhớ) cho giá trị. Vì vậy, sao chép một biến như vậy hoặc chuyển nó dưới dạng đối số hàm sao chép tham chiếu đó chứ không phải bản thân đối tượng. -All operations via copied references (like adding/removing properties) are performed on the same single object. +Tất cả các hoạt động thông qua các tham chiếu được sao chép (như thêm/xóa thuộc tính) được thực hiện trên cùng một đối tượng. -To make a "real copy" (a clone) we can use `Object.assign` for the so-called "shallow copy" (nested objects are copied by reference) or a "deep cloning" function, such as [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep). +Để tạo một "bản sao thực" (bản sao), chúng ta có thể sử dụng `Object.assign` cho cái gọi là "bản sao nông" (các đối tượng lồng nhau được sao chép theo tham chiếu) hoặc chức năng "nhân bản sâu", chẳng hạn như [_.cloneDeep (obj)](https://lodash.com/docs#cloneDeep). From 993610cb5578011b27251127e211feb99660b0e8 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:20:17 +0700 Subject: [PATCH 02/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 267f04578..ce618d7e0 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -username \ No newline at end of file +người dùngtên From c9007446ede9a454f628ba53937ad92f96bd4440 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:20:37 +0700 Subject: [PATCH 03/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index ce618d7e0..83f65ebb9 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From 522f4d547c4b913da63cd368f78fb3fa3906a4da Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:20:52 +0700 Subject: [PATCH 04/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 83f65ebb9..d0284ab7b 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From 598dd94928579073c43906aeed807cd3551812de Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:21:05 +0700 Subject: [PATCH 05/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index d0284ab7b..d482a633c 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From 6d9927ef9718787c03665a6bfcc19f50b7d7ebdd Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:21:17 +0700 Subject: [PATCH 06/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index d482a633c..7aa70f796 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From 6d01f6f729bb2454a5b0db1dc13401935aec4668 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:21:28 +0700 Subject: [PATCH 07/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 7aa70f796..08c8422d2 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From d3da6bfb2aa32eea113a851e7bb86ea61ef197ee Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:21:41 +0700 Subject: [PATCH 08/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 08c8422d2..9614de483 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +người dùngtên From 3ef90a8204c28d17cf957932cb54038ef46c0363 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:22:56 +0700 Subject: [PATCH 09/28] Update variable-copy-reference.svg --- .../04-object-basics/02-object-copy/variable-copy-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index a847fb200..2ed389b4e 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -useradminname \ No newline at end of file +người dùngquản trị viêntên From 75755cb57b7ef504329ad42eceb6aa8f420daeb2 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:23:17 +0700 Subject: [PATCH 10/28] Update variable-copy-reference.svg --- .../04-object-basics/02-object-copy/variable-copy-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index 2ed389b4e..731c50612 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -người dùngquản trị viêntên +người dùngquản trị viêntên From 811d874ce0c45b9f5b530c904305cc259b7629f8 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:23:30 +0700 Subject: [PATCH 11/28] Update variable-copy-reference.svg --- .../04-object-basics/02-object-copy/variable-copy-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index 731c50612..e8efbe271 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -người dùngquản trị viêntên +người dùngquản trị viêntên From 8ab69d4a802ecda751337ab4219377098688c888 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:23:50 +0700 Subject: [PATCH 12/28] Update variable-copy-reference.svg --- .../04-object-basics/02-object-copy/variable-copy-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index e8efbe271..46a9518e7 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -người dùngquản trị viêntên +người dùngquản trị viêntên From 31af918481bb23a862e505053e6c80e77649f53c Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:25:11 +0700 Subject: [PATCH 13/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 0d6ca67bc..d3c66bbba 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Hello!"message"Hello!"phrase \ No newline at end of file +"Xin chào!"message"Xin chào!"phrase From 99b022c6337be9cdbb84268ebb1c62780dd03719 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:25:40 +0700 Subject: [PATCH 14/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index d3c66bbba..daf7b250a 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 05325cb97b5f550ed94a24f72140e1c0e339d049 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:26:00 +0700 Subject: [PATCH 15/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index daf7b250a..029fe3a9f 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 0235caf60e4e6f338758967e2c6cb2e030dfe4f0 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:26:20 +0700 Subject: [PATCH 16/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 029fe3a9f..9abbcf4b6 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 3eed85418d6cecccd74fd89e468976cfd81be76d Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:26:41 +0700 Subject: [PATCH 17/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 9abbcf4b6..ae790841c 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 3faa5b26f16dd486287ee3070945e15474ed7961 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:26:55 +0700 Subject: [PATCH 18/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index ae790841c..2bbde0ea6 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 9413a0f57bab19edb6969a7fe7db2a6cfe356063 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:27:14 +0700 Subject: [PATCH 19/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 2bbde0ea6..d2cd3471e 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 2e5443712a9b1885ffb09c2d2c3e85329aba4c41 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:27:36 +0700 Subject: [PATCH 20/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index d2cd3471e..fa8e7ac9d 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 3fff8e008d9ab4a9d7c7b7cd4d41d38fd1e34ee0 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:27:58 +0700 Subject: [PATCH 21/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index fa8e7ac9d..499a963e1 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 650d5be00a885367cd8f719386b1e0f1ce77ac8f Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:28:20 +0700 Subject: [PATCH 22/28] Update variable-copy-value.svg --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 499a963e1..d617102fd 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Xin chào!"message"Xin chào!"phrase +"Xin chào!"message"Xin chào!"phrase From 695bbfc3df277c6c178a9d5dccb40e4b5beb08b5 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 16:04:05 +0700 Subject: [PATCH 23/28] Update article.md --- 1-js/04-object-basics/02-object-copy/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 8e32133fb..c1f559734 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -190,7 +190,7 @@ Ngoài ra còn có các phương pháp nhân bản đối tượng khác, ví d ## Nhân bản lồng nhau -Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `người dùng` là nguyên thủy. Nhưng các thuộc tính có thể là tham chiếu đến các +Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `user` là nguyên thủy. Nhưng các thuộc tính có thể là tham chiếu đến các đối tượng khác. Làm gì với chúng đây? Như thế này: @@ -253,7 +253,7 @@ Có vẻ như dòng `(*)` sẽ gây ra lỗi, nhưng không phải vậy. Giá t Nói cách khác, `const user` chỉ báo lỗi nếu chúng ta cố gắng đặt toàn bộ `user=...`. -Điều đó nói rằng, nếu chúng ta thực sự cần tạo các thuộc tính đối tượng không đổi, thì cũng có thể, nhưng sử dụng các phương thức hoàn toàn khác. Chúng tôi sẽ đề cập đến điều đó trong chương . +Điều đó nói rằng, nếu chúng ta thực sự cần tạo các thuộc tính đối tượng không đổi, thì cũng có thể, nhưng sử dụng các phương thức hoàn toàn khác. Chúng ta sẽ đề cập đến điều đó trong chương . ```` ## Tóm tắt From 243d89041a8fc5ea44cb1c3ee71b6a98c021dc80 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 16:04:53 +0700 Subject: [PATCH 24/28] Update variable-contains-reference.svg --- .../02-object-copy/variable-contains-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 9614de483..f4459436e 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -người dùngtên +username From d6cf51348ff94d5a56cc8664c0ba9a7ce9b010ff Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 16:05:39 +0700 Subject: [PATCH 25/28] Update variable-copy-reference.svg --- .../04-object-basics/02-object-copy/variable-copy-reference.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index 46a9518e7..38cfa99f9 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -người dùngquản trị viêntên +useradminname From da32f5f51e2d453c2b4ea7978257c70b52133ca5 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 16:11:01 +0700 Subject: [PATCH 26/28] Update article.md --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index c1f559734..0db947cf3 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -1,6 +1,6 @@ # Tham chiếu và sao chép đối tượng -Một trong những điểm khác biệt cơ bản của đối tượng so với đối tượng nguyên thủy là đối tượng được lưu trữ và sao chép "theo tham chiếu", trong khi các giá trị nguyên thủy: chuỗi, số, booleans, v.v. -- luôn được sao chép "dưới dạng toàn bộ giá trị". +Một trong những điểm khác biệt cơ bản của đối tượng so với nguyên hàm là đối tượng được lưu trữ và sao chép "theo tham chiếu", trong khi các giá trị nguyên thủy: chuỗi, số, booleans, v.v. -- luôn được sao chép "dưới dạng toàn bộ giá trị". Điều đó dễ hiểu nếu chúng ta xem xét một chút về những gì xảy ra khi chúng ta sao chép một giá trị. From 35bd79509a82de1f0fb5595da6cfac311a83294b Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 22:01:55 +0700 Subject: [PATCH 27/28] Some English sync --- .../02-object-copy/article.md | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 0db947cf3..5a8e04c7d 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -138,16 +138,17 @@ Ngoài ra, chúng ta có thể sử dụng phương thức [Object.assign](mdn:j Cú pháp là: ```js -Object.assign(dest, [src1, src2, src3...]) +Object.assign(dest, ...sources) ``` - Đối số đầu tiên `dest` là một đối tượng đích. -- Các đối số khác `src1, ..., srcN` (có thể bao nhiêu tùy ý) là các đối tượng nguồn. -- Nó sao chép các thuộc tính của tất cả các đối tượng nguồn `src1, ..., srcN` vào đích `dest`. Nói cách khác, các thuộc tính của tất cả các đối số bắt đầu từ đối số thứ hai được sao chép vào đối tượng đầu tiên. -- Cuộc gọi trả về `dest`. +- Các đối số khác là danh sách các đối tượng nguồn. -Chẳng hạn, chúng ta có thể sử dụng nó để hợp nhất nhiều đối tượng thành một: -```js +Nó sao chép các thuộc tính của tất cả các đối tượng nguồn vào `dest` đích, sau đó trả về nó dưới dạng kết quả. + +Ví dụ: chúng ta có đối tượng `user`, hãy thêm một số quyền cho đối tượng đó: + +```js run let user = { name: "John" }; let permissions1 = { canView: true }; @@ -159,6 +160,9 @@ Object.assign(user, permissions1, permissions2); */!* // bây giờ người dùng = { name: "John", canView: true, canEdit: true } +alert(user.name); // John +alert(user.canView); // true +alert(user.canEdit); // true ``` Nếu tên thuộc tính được sao chép đã tồn tại, nó sẽ bị ghi đè: @@ -171,7 +175,7 @@ Object.assign(user, { name: "Pete" }); alert(user.name); // now user = { name: "Pete" } ``` -Chúng ta cũng có thể sử dụng `Object.assign` để thay thế vòng lặp `for..in` để sao chép đơn giản: +Chúng ta cũng có thể sử dụng `Object.assign` để thực hiện nhân bản một đối tượng đơn giản: ```js let user = { @@ -190,7 +194,7 @@ Ngoài ra còn có các phương pháp nhân bản đối tượng khác, ví d ## Nhân bản lồng nhau -Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `user` là nguyên thủy. Nhưng các thuộc tính có thể là tham chiếu đến các +Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `user` là nguyên hàm. Nhưng các thuộc tính có thể là tham chiếu đến các đối tượng khác. Làm gì với chúng đây? Như thế này: From d3fca5a89eecec73d1f6dcea58aa94dd17cb8f30 Mon Sep 17 00:00:00 2001 From: I_am_Vietnam <91591390+ImVietnam@users.noreply.github.com> Date: Wed, 7 Jun 2023 23:00:36 +0700 Subject: [PATCH 28/28] Sync with en version --- .../02-object-copy/article.md | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 5a8e04c7d..a8342917e 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -104,11 +104,9 @@ alert( a == b ); // false 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? Tạo một bản sao độc lập, một bản sao? +Nhưng nếu chúng ta cần sao chép một đối tượng thì sao? -Điều đó cũng có thể thực hiện được, nhưng hơi khó hơn một chút vì không có phương thức tích hợp sẵn nào cho điều đó trong JavaScript. Nhưng hiếm khi có nhu cầu - hầu hết thời gian sao chép theo tham chiếu là tốt. - -Nhưng nếu chúng ta thực sự muốn điều đó, thì chúng ta cần tạo một đối tượng mới và sao chép cấu trúc của đối tượng hiện có bằng cách lặp lại các thuộc tính của nó và sao chép chúng ở cấp độ nguyên thủy. +Chúng ta có thể tạo một đối tượng mới và sao chép cấu trúc của đối tượng hiện có, bằng cách lặp lại các thuộc tính của nó và sao chép chúng ở cấp độ nguyên thủy. Như thế này: @@ -127,13 +125,13 @@ for (let key in user) { } */!* -// bây giờ bản sao là một đối tượng hoàn toàn độc lập với cùng một nội dung +// bây giờ clone là một đối tượng hoàn toàn độc lập với cùng một nội dung clone.name = "Pete"; // đã thay đổi dữ liệu trong đó alert( user.name ); // vẫn còn John trong đối tượng ban đầu ``` -Ngoài ra, chúng ta có thể sử dụng phương thức [Object.assign](mdn:js/Object/assign) cho việc đó. +Chúng ta cũng có thể sử dụng phương thức [Object.assign](mdn:js/Object/assign). Cú pháp là: @@ -159,7 +157,7 @@ let permissions2 = { canEdit: true }; Object.assign(user, permissions1, permissions2); */!* -// bây giờ người dùng = { name: "John", canView: true, canEdit: true } +// bây giờ user = { name: "John", canView: true, canEdit: true } alert(user.name); // John alert(user.canView); // true alert(user.canEdit); // true @@ -172,7 +170,7 @@ let user = { name: "John" }; Object.assign(user, { name: "Pete" }); -alert(user.name); // now user = { name: "Pete" } +alert(user.name); // bây giờ user = { name: "Pete" } ``` Chúng ta cũng có thể sử dụng `Object.assign` để thực hiện nhân bản một đối tượng đơn giản: @@ -186,16 +184,19 @@ let user = { *!* let clone = Object.assign({}, user); */!* + +alert(clone.name); // John +alert(clone.age); // 30 ``` -Nó sao chép tất cả các thuộc tính của `user` vào đối tượng trống và trả về nó. +Ở đây, nó sao chép tất cả các thuộc tính của `user` vào đối tượng trống và trả về nó. Ngoài ra còn có các phương pháp nhân bản đối tượng khác, ví dụ: sử dụng [cú pháp trải rộng](info:rest-parameters-spread) `clone = {...user}`, sẽ được trình bày sau trong hướng dẫn. ## Nhân bản lồng nhau Cho đến bây giờ, chúng ta giả định rằng tất cả các thuộc tính của `user` là nguyên hàm. Nhưng các thuộc tính có thể là tham chiếu đến các -đối tượng khác. Làm gì với chúng đây? +đối tượng khác. Như thế này: ```js run @@ -210,9 +211,7 @@ let user = { alert( user.sizes.height ); // 182 ``` -Bây giờ sao chép `clone.sizes = user.sizes` là không đủ, vì `user.sizes` là một đối tượng, nó sẽ được sao chép theo tham chiếu. Vì vậy, `clone` và `user` sẽ có cùng kích thước: - -Như thế này: +Bây giờ không đủ để sao chép `clone.sizes = user.sizes`, bởi vì `user.sizes` là một đối tượng và sẽ được sao chép theo tham chiếu, vì vậy `clone` và `user` sẽ có cùng kích thước: ```js run let user = { @@ -227,12 +226,12 @@ let clone = Object.assign({}, user); alert( user.sizes === clone.sizes ); // true, cùng một đối tượng -// người dùng và bản sao chia sẻ kích thước +// user và clone chia sẻ kích thước user.sizes.width++; // thay đổi một thuộc tính từ một nơi -alert(clone.sizes.width); // 51, xem kết quả từ một cái khác +alert(clone.sizes.width); // 51, lấy kết quả từ một cái khác ``` -Để khắc phục điều đó, chúng ta nên sử dụng một vòng lặp nhân bản để kiểm tra từng giá trị của `user[key]` và nếu đó là một đối tượng thì cũng sao chép cấu trúc của nó. Đó được gọi là "nhân bản sâu". +Để khắc phục điều đó và làm cho các đối tượng `user` và `clone` thực sự tách biệt, chúng ta nên sử dụng vòng lặp nhân bản để kiểm tra từng giá trị của `user[key]` và nếu đó là một đối tượng thì cũng sao chép cấu trúc của nó. Đó được gọi là "nhân bản sâu". Chúng ta có thể sử dụng đệ quy để thực hiện nó. Hoặc, để không phát minh lại bánh xe, hãy thực hiện triển khai hiện có, chẳng hạn như [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) từ thư viện JavaScript [lodash](https://lodash. com).