Để làm việc hiệu quả hơn cũng như tối ưu được thời gian làm việc cho một task, biết thêm một số tips hay ho sẽ giúp ích rất nhiều cho bạn. Dưới đây tôi sẽ giới thiệu với các dev một số JavaScript tip khi làm việc bằng ngôn ngữ JavaScript để tiết kiệm thời gian và công sức.
Đây là một JavaScript tip phổ biến hiện tại. Destructuring là một tính năng đã được giới thiệu trong ES6. Đó là một trong những tính năng bạn sẽ sử dụng hàng ngày khi bạn biết cách. Nó giúp bạn giải quyết ba vấn đề chính:
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
// Wow... should we display
// John's password like that?
const firstName = user.firstName;
const lastName = user.lastName;
const password = user.password;
user.firstName
, user.family.sister
)Bây giờ bạn đã thấy ba vấn đề này với các đối tượng là gì, bạn nghĩ bạn có thể giải quyết chúng như thế nào? Hãy sử dụng các JavaScript tip dưới đây:
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const { firstName, lastName, password } = user;
console.log(firstName, lastName, password);
// Output: 'John', 'Doe', '123'
Destructuring là quá trình trích xuất một thuộc tính từ một đối tượng bằng key của nó. Bằng cách lấy một key hiện có trong đối tượng, sau đó đặt nó giữa hai dấu ngoặc ( { firstName }
)
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
family: {
sister: {
firstName: "Maria",
},
},
};
// We access to the nested object `sister`
// and we extract the `firstName` property
const { firstName } = user.family.sister;
console.log(firstName);
// Output: 'Maria'
Khi làm việc với các đối tượng lồng ghép vào nhau, nó có thể bị lặp lại và lãng phí nhiều thời gian khi truy cập cùng một thuộc tính nhiều lần.
Sử dụng cấu trúc destructuring, chỉ trong một dòng, bạn có thể giảm đường dẫn thuộc tính thành một biến.
Nếu bạn biết React, có lẽ bạn đã quen thuộc với vấn đề này.
function getUserFirstName({ firstName }) {
return firstName;
}
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
console.log(getUserFirstName(user));
// Output: 'John'
Trong ví dụ trên, chúng ta có một getUserFirstName
hàm và biết rằng nó sẽ chỉ sử dụng một thuộc tính của đối tượng là firstName
.
Thay vì truyền toàn bộ đối tượng hoặc tạo một biến mới, chúng ta có thể destructure các tham số hàm của đối tượng.
Trong lập trình, bạn thường phải giải quyết các vấn đề với cấu trúc dữ liệu. Nhờ toán tử spread được giới thiệu trong ES6, các thao tác đối tượng và mảng đơn giản hơn.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const userJob = {
jobName: "Developer",
jobCountry: "France",
jobTimePerWeekInHour: "35",
};
Hãy tưởng tượng rằng chúng ta có hai đối tượng:
Chúng ta muốn tạo một đối tượng chỉ chứa các thuộc tính của hai đối tượng này.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const userJob = {
jobName: "Developer",
jobCountry: "France",
jobTimePerWeekInHour: "35",
};
const myNewUserObject = {
...user,
...userJob,
};
console.log(myNewUserObject);
// Output:
//{
// firstName: 'John',
// lastName: 'Doe',
// password: '123',
// jobName: 'Developer',
// jobCountry: 'France',
// jobTimePerWeekInHour: '35'
//}
Sử dụng toán tử spread ( ...
), chúng ta có thể trích xuất tất cả các thuộc tính của đối tượng này sang đối tượng khác.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const myNewUserObject = {
...user,
// We extract:
// - firstName
// - lastName
// - password
// and send them to
// a new object `{}`
};
const girlNames = ["Jessica", "Emma", "Amandine"];
const boyNames = ["John", "Terry", "Alexandre"];
const namesWithSpreadSyntax = [...girlNames, ...boyNames];
console.log(namesWithSpreadSyntax);
// Output: ['Jessica', 'Emma', 'Amandine', 'John', 'Terry', 'Alexandre']
Giống như các đối tượng, toán tử spread ( ...
) trích xuất tất cả các phần tử từ mảng này sang mảng khác.
const girlNames = ["Jessica", "Emma", "Amandine"];
const newNewArray = [
...girlNames,
// We extract:
// - 'Jessica'
// - 'Emma'
// - 'Amandine'
// and send them to
// a new array `[]`
];
Vì mảng là danh sách nên có thể có nhiều mục cùng giá trị. Nếu bạn muốn loại bỏ các bản sao trong mảng của mình, bạn có thể làm theo một trong các ví dụ dưới đây.
Một trong số đó sẽ chỉ có một dòng nhờ ES6, nhưng tôi để ví dụ “cũ” trong đó để bạn có thể so sánh.
onst animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
const uniqueAnimalsWithFilter = animals.filter(
// Parameters example: 'owl', 0, ['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']
(animal, index, array) => array.indexOf(animal) == index
);
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
Trong ví dụ trên, tôi muốn clean mảng animals
bằng cách loại bỏ tất cả các bản sao.
Chúng ta có thể làm điều đó bằng cách sử dụng hàm filter
với indexOf
bên trong nó.
Các filter
chức năng sẽ đưa tất cả các yếu tố của mảng animals
( animals.filter
). Sau đó, đối với mỗi lần xuất hiện, nó cung cấp:
duck
🙂animals
mảng => ['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']
)Tôi sẽ áp dụng indexOf
trên mảng ban đầu cho mỗi lần xuất hiện và đưa ra dưới dạng một tham số là biến animal
(giá trị hiện tại).
indexOf
sẽ trả về chỉ mục đầu tiên của giá trị hiện tại (ví dụ: đối với ‘cú’, chỉ mục là 0).
Sau đó, bên trong bộ lọc, tôi so sánh giá trị của indexOf
với chỉ mục hiện tại. Nếu nó giống nhau, chúng tôi trả lại true
khác false
.
filter
sẽ tạo một mảng mới chỉ với các phần tử có giá trị trả về true
.
Vì vậy, trong trường hợp của chúng tôi: ['owl', 'frog', 'canary', 'duck', 'goose']
.
Cách cũ cũng thú vị nhưng nó dài và hơi khó. Nếu muốn bạn có thể thực hiện bằng cách mới như sau:
const animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
const uniqueAnimalsWithSet = [...new Set(animals)];
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
Hãy tách các bước khác nhau ra:
// 1
const animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
// 2
const animalsSet = new Set(animals);
console.log(animalsSet);
// Output: Set { 'owl', 'frog', 'canary', 'duck', 'goose' }
// 3
const uniqueAnimalsWithSet = [...animalsSet];
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
Tôi có một mảng animal
và muốn chuyển đổi nó thành một Set
, là một loại đối tượng đặc biệt trong ES6.
Điều khác biệt ở nó là nó cho phép bạn tạo ra một bộ sưu tập các giá trị độc đáo.
Khi chúng ta có Set
đối tượng của mình với các giá trị duy nhất, chúng ta cần chuyển đổi nó trở lại một mảng.
Để làm điều đó, tôi sử dụng các toán tử spread để phá hủy nó và gửi tất cả các thuộc tính sang một thuộc tính mới Array
.
Vì Set
đối tượng có các thuộc tính duy nhất nên mảng mới của chúng ta cũng sẽ chỉ có các giá trị duy nhất.
Bạn đã nghe nói về cách viết các điều kiện nhỏ chỉ trong một dòng chưa? Hãy làm quen với cách này bằng một JavaScript tip.
Nếu không, đã đến lúc loại bỏ nhiều khối if
và else
chuyển chúng thành các phép toán bậc ba nhỏ.
Hãy xem một ví dụ với console.log
để bắt đầu. Ý tưởng là kiểm tra giá trị của một biến và hiển thị có điều kiện một đầu ra.
const colour = "blue";
if (colour === "blue") {
console.log(`It's blue!`);
} else {
console.log(`It's not blue!`);
}
í dụ này là một trường hợp điển hình trong đó bạn có thể sử dụng toán tử bậc ba để giảm 5 if
và else
các dòng này xuống chỉ còn một!
Một dòng để tổng hợp tất cả!
const colour = "blue";
colour === "blue" ? console.log(`It's blue!`) : console.log(`It's not blue!`);
// [condition] ? [if] : [else]
Toán tử bậc ba thay thế if
và else
cho các điều kiện nhỏ.
Dưới đây là một ví dụ khác sử dụng toán tử bậc ba, nhưng lần này là return
trong một hàm.
function sayHelloToAnne(name) {
return name === "Anne" ? "Hello, Anne!" : "It's not Anne!";
}
console.log(sayHelloToAnne("Anne"));
// Output: 'Hello, Anne!'
console.log(sayHelloToAnne("Gael"));
// Output: "It's not Anne!"
Hi vọng một số tip hay ho trên đây có thể giúp bạn coding hiệu quả hơn với ngôn ngữ JavaScript. Happy Coding!
Bài viết gốc được đăng tải tại freecodecamp.org