Accessors, Events & Phần khác
Accessors
Không bắt buộc phải có accessor cho mọi property
Tránh getter/setter; nếu cần thì dùng getVal() / setVal('hello')
Getter/setter gây side effect khó đoán và khó test.
Property/method boolean: dùng isVal() hoặc hasVal()
// ✅ Tốt
if (!dragon.hasAge()) {
return false;
}
Có thể dùng get()/set() chung; đặt tên nhất quán
Events
Gắn data vào event: truyền object literal (hash), không truyền giá trị thô
Để sau này thêm field không phải sửa mọi handler.
// ✅ Tốt
$(this).trigger("listingUpdated", { listingID: listing.id });
$(this).on("listingUpdated", (e, data) => {
// do something with data.listingID
});
jQuery
Biến chứa jQuery object: prefix $
// ✅ Tốt
const $sidebar = $(".sidebar");
Cache jQuery lookup, không gọi $('.sidebar') nhiều lần
Query DOM: dùng cascade $('.sidebar ul') hoặc parent > child $('.sidebar > ul')
Dùng find với jQuery object đã scope
// ✅ Tốt
$sidebar.find("ul").hide();
Iterators and Generators
Ưu tiên higher-order functions (map/every/filter/find/reduce/some/…) thay vì for-in/for-of
// best
const sum = numbers.reduce((total, num) => total + num, 0);
const increasedByOne = numbers.map((num) => num + 1);
Hiện tại không khuyến nghị dùng generator (transpile sang ES5 kém)
Nếu dùng generator: khoảng cách đúng giữa function và * — function* foo() { }
Standard Library
Dùng Number.isNaN thay vì global isNaN
Global isNaN ép kiểu; Number.isNaN chỉ true khi giá trị thực sự là NaN.