JavaScript là một ... ngôn ngữ ... thú vị. Cá nhân tôi (Grant Sander) thích nó, nhưng có thể thấy tại sao những người khác lại không thích nó. ECMAScript 6, a.k.a. ES6, đã giới thiệu một số tính năng thực sự tuyệt vời giúp phát triển JavaScript thú vị hơn. Trong bài viết ngắn này, tôi muốn nói một chút về destructuring assignment và cung cấp một số ví dụ thực tế, điều này có thể hữu ích.
MDN mô tả destructuring assignment theo cách sau:
- Cú pháp destructuring assignment là một biểu thức JavaScript có thể giải nén các giá trị từ các mảng, hoặc các thuộc tính từ các đối tượng, thành các biến riêng biệt.
Destructuring Assignment với Objects
let myPointInSpace = {
x: 3,
y: -2,
z: 2.7
}
Giả sử bạn muốn thực hiện một số tính toán với tọa độ của điểm [như tính toán khoảng cách của nó từ gốc, (0, 0, 0)], vì vậy bạn muốn ném tọa độ x, y và z của điểm vào một số biến để dễ tham khảo. Người ta có thể làm như sau:
let x = myPointInSpace.x;
let y = myPointInSpace.y;
let z = myPointInSpace.z;
let distance = Math.sqrt(x*x + y*y + z*z);
Điều này chắc chắn hoạt động! Nhưng nếu bạn làm điều đó đủ thời gian, bạn có thể bị bệnh sao chép / dán. Với destructuring assignment, bạn có thể nhổ những tọa độ đó theo một cách ngắn gọn hơn nhiều! Dưới đây là cách thực hiện:
let {x, y, z} = myPointInSpace;
let distance = Math.sqrt(x*x + y*y + z*z);
Các dấu ngoặc nhọn trong trường hợp này chỉ ra destructuring assignment. Dòng đầu tiên ở trên nhìn vào biến myPointInSpace và tìm kiếm bất kỳ thuộc tính nào được chỉ định trong dấu ngoặc nhọn và sẽ trả về các biến đó trong các phép gán biến riêng lẻ.
let {x, y} = myPointInSpace;
Destructuring Assignment với Arrays
let x = myPointInSpace[0];
let y = myPointInSpace[1];
let z = myPointInSpace[2];
let [x, y, z] = myPointInSpace;
Khá gọn gàng!
Một số ví dụ thực tế
Đặt giá trị hàm mặc định
let toMilliseconds = ({
hours = 0,
minutes = 0,
seconds = 0
}) => {
// Compute the # of ms
let ms = (hours * 60 * 60 * 1000) + (minutes * 60 * 1000) + (seconds * 1000);
// Return the # of ms
return ms;
}
let ms1 = toMilliseconds({hours: 3, minutes: 42, seconds: 33});
let ms2 = toMilliseconds({minutes: 7});
Trao đổi giá trị
Trao đổi các giá trị của biến là một thủ tục khá phổ biến, và thường liên quan đến việc tạo ra một biến tạm thời. Đây là một ví dụ điển hình về điều này.
// Initial values
let x = 5;
let y = 3;
// Now swap, creating tmp variable
let tmp = y;
y = x;
x = tmp;
delete tmp;
// Initial values
let x = 5;
let y = 3;
// Now swap
[x, y] = [y, x];
Nếu bạn thấy mình trao đổi các biến thường xuyên, destructuring có thể là một công cụ thực sự tốt đẹp.
Kéo giá trị và đặt tên mới
Với destructuring đối tượng, bạn thực sự có thể đặt tên cho các biến của mình ngoài các khóa của đối tượng mà bạn đang destructuring. Giả sử bạn đang sử dụng một API, và API gửi trả lời một đối tượng mà đối tượng có tên lạ mà bạn không thích sử dụng. Một cái gì đó như sau:
let apiResponse = {
someWeirdKeyForX: 3,
someWeirdKeyForY: -7
}
let {someWeirdKeyForX: x, someWeirdKeyForY: y} = apiResponse;
Phần someWeirdKeyForX: x của destructuring tuyên bố rằng bạn muốn kéo khóa someWeirdKeyForX từ apiResponse và bạn muốn gán nó cho một biến có tên là x. Điều này có thể hữu ích đáng ngạc nhiên. Thực tế, tôi thích sử dụng điều này trong các tình huống đơn giản như gán một cái gì đó như apiResponse.latitude cho lat và apiResponse.longitude cho lng.
Coi chừng!
Một chút "gotcha" mà tôi vấp vào một vài lần là một thực tế là đôi khi bạn cần phải quấn các destructuring statements của bạn trong dấu ngoặc đơn. Nếu destructuring statements của bạn không bắt đầu với một từ khóa khai báo biến (như var, let, hoặc const), bạn sẽ cần bọc câu lệnh của bạn trong dấu ngoặc đơn. Tôi giả sử điều này là để trình biên dịch biết cách phân biệt giữa {...} trong câu lệnh hủy và {...} chỉ ra các khối mã.
// Declare x and y ahead of time
let x, y;
// Object that we will destructure
let o = {x: 3, y: -7};
// Try to destructure
{x, y} = o; // -> No good!
Trình biên dịch không biết cách diễn giải dòng mã cuối cùng đó. Bạn sẽ cần phải thay đổi nó thành:
// Declare x and y ahead of time
let x, y;
// Object that we will destructure
let o = {x: 3, y: -7};
// Successfully destructure
({x, y} = o); // -> Good!
Và hơn thế!
Bài dịch từ trang https://dev.to/gksander/destructuring-assignment-in-javascript-1ace .
Xin cảm ơn các bạn đã theo dõi bài viết của Nguyên Vũ.
Bình luận