Best Practices của tôi – JavaScript
1. Tắt cache
Firefox:
Mở Developer Tools -> Mở Settings (F1) -> "Disable HTTP Cache (when toolbox is open)"
Chrome:
Mở Developer Tools -> Mở Settings (F1) -> "Disable cache (while DevTools is open)"
2. Luôn mở console JS
Trong DevTools, mở tab Console và giữ nó luôn mở, để bước 1 tiếp tục có hiệu lực và bạn cũng thấy được các lỗi mạng và lỗi JS.
Plugin này cũng rất đáng dùng, nó hiển thị lỗi JS còn rõ hơn nữa, phòng khi chính bạn quên để ý:
3. JavaScript: Sách nhất định phải đọc “You Don't Know JS”
- You Don't Know JS (1st Edition)
- Giải thích vì sao nên tránh dùng
this - Giải thích vì sao đôi khi trong JS lại xảy ra những chuyện có vẻ kỳ quặc (từ khóa: lexical scope, closure)
4. Dấu chấm phẩy
- Luôn luôn dùng
- Không bắt buộc, nhưng có thể giúp tránh những cái bẫy như thế này: Stack Overflow
- JavaScript tự động chèn dấu chấm phẩy:
// you want to return 5 and have ugly formatting:
return
5
// JavaScript Interpretation:
return;
5;
5. Toán tử logic && và ||
- Trong Java,
a && bvàa || bđược đánh giá theo đại số Boole.avàbphải là boolean. - Trong JavaScript:
- Với
a && b,bđược trả về nếualà true - Với
a || b,bđược trả về nếualà false
- Với
Các biểu thức cũng có thể được nối theo cách này, cho phép viết câu lệnh if ngắn nhất có thể – syntax sugar:
isAdmin && showDeleteButton();- (Nói cho chính xác thì đây không còn là một câu lệnh nữa)
Cách này cũng hay được dùng cho giá trị mặc định:
let sendNewsletter = form.getNewsletterOptIn() || false;
6. JavaScript là pass-by-reference hay pass-by-value?
Trong JavaScript, chuyện này khá thú vị. Ví dụ:
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
Cho ra kết quả sau:
10
changed
unchanged
Nếu obj1 hoàn toàn không phải là tham chiếu, thì việc thay đổi obj1.item sẽ không ảnh hưởng gì đến obj1 bên ngoài hàm.
Nếu đối số là một tham chiếu thực sự, thì mọi thứ đều sẽ thay đổi: num sẽ là 100, và obj2.item sẽ chứa “changed”. Thay vào đó, num vẫn là 10 và
obj2.item vẫn là “unchanged”.
Thực tế, phần tử được truyền vào theo giá trị. Tuy nhiên, thứ được truyền theo giá trị ấy lại chính là một tham chiếu. Về mặt kỹ thuật, cách này được gọi là call-by-sharing.
Trong thực tế, điều đó có nghĩa là: Nếu bạn thay đổi chính tham số (như với num và obj2), điều đó không ảnh hưởng gì đến đối tượng gốc đã được truyền vào
hàm. Nhưng nếu bạn thay đổi các giá trị bên trong của tham số, những thay đổi đó sẽ được giữ lại (như với obj1).