12 thủ thuật vô cùng hữu ích dành cho lập trình viên JavaScript

Trong bài viết này, Quản Trị Mạng sẽ chia sẻ 12 thủ thuật vô cùng hữu ích dành cho lập trình viên JavaScript. Những thủ thuật này sẽ giúp bạn giảm lượng code cũng như giúp code chạy tối ưu hơn. Mời các bạn cùng đón đọc!

1. Chuyển đổi sang boolean sử dụng toán tử !!

Đôi khi chúng ta cần kiểm tra xem một biến có tồn tại hoặc có giá trị hợp lệ hay không, để xem chúng như true value. Để xác định, bạn có thể sử dụng !! (Double negation operator - toán tử phủ định kép) một !!variable đơn giản, sẽ tự động chuyển đổi bất kỳ kiểu dữ liệu nào về boolean và biến này sẽ trả về false khi nó có những giá trị như: 0null; ""; undefined hoặc NaN, nếu không nó sẽ trả về true. Để hiểu hơn về cách nó hoạt động, hãy xem qua ví dụ đơn giản sau: 

function Account(cash) { 
this.cash = cash;
this.hasMoney = !!cash;
}
var account = new Account(100.50);
console.log(account.cash); // 100.50
console.log(account.hasMoney); // true

var emptyAccount = new Account(0);
console.log(emptyAccount.cash); // 0
console.log(emptyAccount.hasMoney); // false

Trong ví dụ trên, nếu giá trị account.cash lớn hơn 0 thì account.hasMoney sẽ có giá trị là true.

12 thủ thuật vô cùng hữu ích dành cho lập trình viên JavaScript

2. Chuyển đổi sang number sử dụng toán tử +

Thủ thuật này rất tuyệt vời và dễ dàng thực hiện. Tuy nhiên, nó chỉ hoạt động với chuỗi số, ngược lại nó sẽ trả về NaN (Not a Number - Không phải số). Hãy nhìn ví dụ sau:

function toNumber(strNumber) { 
return +strNumber;
}
console.log(toNumber("1234")); // 1234
console.log(toNumber("ACB")); // NaN

Thủ thuật này cũng hoạt động với cả Date và trong trường hợp này nó sẽ trả về số timestamp:

console.log(+new Date()) // 1461288164385

3. Rút gọn các điều kiện

Nếu bạn thấy một đoạn code giống như bên dưới:

if (conected) { 
login();
}

Bạn có thể rút gọn nó bằng cách kết hợp một biến (sẽ được xác nhận) và một hàm sử dụng && (toán tử AND) ở giữa. Ví dụ, đoạn code trên có thể trở nên ngắn gọn hơn trong một dòng:

conected && login();

Bạn có thể làm tương tự để kiểm tra xem thuộc tính hay hàm có tồn tại trong object không. Tương tự như đoạn code bên dưới:

user && user.login();

4. Đặt giá trị mặc định sử dụng toán tử ||

Hiện tại, ES6 đã có tính năng tham số mặc định. Để mô phỏng tính năng này trong các trình duyệt cũ, bạn có thể sử dụng || (toán tử OR) bằng cách chèn giá trị mặc định như tham số thứ hai để sử dụng. Nếu tham số đầu tiên trả về false thì tham số thứ hai sẽ được sử dụng như một giá trị mặc định. Hãy xem ví dụ sau:

function User(name, age) { 
this.name = name || "Oliver Queen";
this.age = age || 27;
}
var user1 = new User();
console.log(user1.name); // Oliver Queen
console.log(user1.age); // 27var user2 = new User("Barry Allen", 25);
console.log(user2.name); // Barry Allen
console.log(user2.age); // 25

5. Lưu trữ array.length trong vòng lặp

Thủ thuật này rất đơn giản và gây tác động lớn tới hiệu suất khi xử lý các mảng lớn trong vòng lặp. Về cơ bản, hầu hết mọi người thường sử dụng vòng lặp for để duyệt qua mảng như sau:

for (var i = 0; i < array.length; i++) { 
console.log(array[i]);
}

Nếu làm việc với các mảng nhỏ thì không sao, nhưng nếu bạn xử lý những mảng lớn thì đoạn code này sẽ tính toán lại kích cỡ của mảng sau mỗi lần lặp và điều đó sẽ gây một chút chậm trễ. Để tránh điều này, bạn có thể lưu trữ (cache) array.length trong một biến để dùng nó thay vì gọi array.length trong mỗi lần lặp:

var length = array.length; 
for (var i = 0; i < length; i++) {
console.log(array[i]);
}

Để làm nó trông gọn hơn, bạn chỉ việc viết lại như sau:

for (var i = 0, length = array.length; i < length; i++) { 
console.log(array[i]);
}

6. Nhận diện các thuộc tính trong một object

Thủ thuật này vô cùng hữu ích khi bạn cần kiểm tra xem thuộc tính có tồn tại hay không và tránh chạy các hàm hay thuộc tính chưa được định nghĩa. Nếu định viết code chạy trên nhiều trình duyệt, bạn cũng có thể sử dụng kỹ thuật này.

Ví dụ, hãy tưởng tượng bạn cần viết code tương thích với trình duyệt Web cũ Internet Explorer 6 - IE6 và bạn muốn sử dụng document.querySelector() để lấy một vài phần tử bằng ID của chúng. Tuy nhiên, trong trình duyệt IE6 hàm này không tồn tại. Để kiểm tra xem hàm có tồn tại hay không hãy sử dụng toán tử in như ví dụ bên dưới:

if ('querySelector' in document) { 
document.querySelector("#id");
} else {
document.getElementById("id");
}

Trong trường hợp này, nếu không có hàm querySelector trong document, chúng ta có thể sử dụng document.getElementById() thay thế.

7. Lấy phần tử cuối cùng trong mảng

Array.prototype.slice(begin, end) có thể cắt mảng khi bạn đặt tham số begin và end. Nhưng nếu bạn không nhập tham số end, hàm này sẽ tự động đặt giá trị lớn nhất cho mảng. Chắc hẳn ít người biết được hàm này có thể chấp nhận giá trị âm và nếu bạn đặt tham số begin là một số âm thì bạn sẽ lấy ra các phần tử cuối cùng từ mảng:

var array = [1, 2, 3, 4, 5, 6]; 
console.log(array.slice(-1)); // [6]
console.log(array.slice(-2)); // [5,6]
console.log(array.slice(-3)); // [4,5,6]

8. Cắt ngắn mảng

Kỹ thuật này có thể khóa kích thước mảng, điều này rất hữu ích khi muốn xóa vài phần tử của mảng dựa trên số phần tử mà bạn thiết lập. Ví dụ, nếu bạn có một mảng 10 phần tử nhưng bạn chỉ muốn lấy 5 phần tử đầu tiên thì bạn có thể cắt ngắn mảng, làm nó nhỏ hơn bằng cách đặt array.length = 5. Hãy xem ví dụ sau:

var array = [1, 2, 3, 4, 5, 6]; 
console.log(array.length); // 6
array.length = 3;
console.log(array.length); // 3
console.log(array); // [1,2,3]

9. Thay thế toàn bộ

Hàm String.replace() cho phép sử dụng StringRegex (Biểu thức chính quy) để thay thế chuỗi, nhưng hàm này chỉ thay thế các chuỗi con xuất hiện đầu tiên. Bạn có thể giả lập một hàm replaceAll() bằng cách sử dụng /g ở cuối Regex:

var string = "john john"; 
console.log(string.replace(/hn/, "ana")); // "joana john"
console.log(string.replace(/hn/g, "ana")); // "joana joana"

10. Gộp các mảng

Nếu cần gộp hai mảng lại với nhau, bạn có thể sử dụng hàm Array.concat():

var array1 = [1, 2, 3]; 
var array2 = [4, 5, 6];
console.log(array1.concat(array2)); // [1,2,3,4,5,6];

Tuy nhiên, hàm này không phải là cách thích hợp nhất để gộp các mảng lớn vì nó sẽ tốn rất nhiều bộ nhớ do tạo ra một mảng mới. Trong trường hợp này, bạn có thể sử dụng Array.push.apply(arr1, arr2) thay vì tạo ra một mảng mới, nó sẽ gộp mảng thứ hai vào mảng thứ nhất từ đó giảm việc sử dụng bộ nhớ:

var array1 = [1, 2, 3]; 
var array2 = [4, 5, 6];
console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6];

11. Chuyển NodeList thành mảng

Nếu bạn chạy hàm document.querySelectorAll("p"), nó sẽ trả về một mảng chứa các phần tử DOM, NodeList object. Nhưng object này không có toàn bộ các hàm của mảng như: sort(); reduce(); map(); filter(). Để có thể sử dụng các hàm này và nhiều hàm sẵn có khác của mảng, bạn cần chuyển NodeList thành mảng. Bạn chỉ cần dùng hàm: [].slice.call(elements):

var elements = document.querySelectorAll("p"); // NodeList 
var arrayElements = [].slice.call(elements); // Now the NodeList is an array
var arrayElements = Array.from(elements); // This is another way of converting NodeList to Array

12. Trộn các phần tử trong mảng

Để xáo trộn các phần tử trong mảng mà không sử dụng các thư viện riêng như Lodash, bạn chỉ cần sử dụng thủ thuật sau:

var list = [1, 2, 3]; 
console.log(list.sort(function() {
return Math.random() - 0.5
})); // [2,1,3]

Kết luận

Hiện giờ bạn đã học được một vài thủ thuật JavaScript hữu ích mà phần lớn được sử dụng để giảm thiểu code và một vài thủ thuật được sử dụng trong các framework JavaScript phổ biến như Lodash, Underscore.js, Strings.js và nhiều framework khác.

Hy vọng các bạn sẽ thích bài viết này và nếu bạn còn biết những thủ thuật JavaScript hữu ích nào khác, hãy cho chúng tôi biết ở phần bình luận bên dưới nhé!

Tham khảo thêm một số bài viết: 

Chúc các bạn vui vẻ!

Thứ Hai, 29/01/2018 07:03
52 👨 957