Table of Contents
- 1 Tránh bị tấn công vô prototype bằng cách dùng hasOwnProperty
- 2 Dùng Array hơn là Dictionary đối với tập hợp có thứ tự
- 3 Không được thêm những thuộc tính Enumrable cho Object.prototype
- 4 Tránh thay đổi object trong quá trình lặp for...in
- 5 Những trường hợp nên dùng for thay vì for...in
- 6 Dùng những phương thức iteration thay vì loop
- 7 Dùng phương thức generic của array cho những object giống Array
- 8 Nên dùng Array literals thay vì Array constructor.
Khái niệm trong Javascript cần biết để hiểu được những gợi ý trong bài này:
Prototype pollution
: Một cách tấn công vào Javascript runtimes, bằng cách điều khiển default value – nhằm thay đổi logic của app; đa phần dẫn đến lỗi DoS, hoặc nghiêm trọng hơn điểu khiển hệ thống từ xa.Enumerable
/Enumeration
:- Enumerable: để giải thích từ này, để ý:
Mỗi thuộc tính trong Javascript phân loại dựa trên 3 yếu tố: enumerable/non-enumerable; string/symbol; own property/inherited propertyEnumerable
property nó sẽ có một flag interal tên là enumerble được set là true. Những thuộc tính được assign thông thường hoặc được tạo ra trong initializer sẽ là kiểu này. Ngược lại nếu dùngObject.defineProperty
thì nó sẽ là non-enumerable. Lưu ý là,for..in
hay làObject.keys
sẽ chỉ scan qua enumrable property thôi.
- Enumeration:
- Enumerable: để giải thích từ này, để ý:
Array Iteration
/Array Literals
:- Array Iteration
- Literals: Đầu tiên giải thích term literals trong Javascript, literals đại diện cho những giá trị trong Javascript, nó là những fixed value, không phải là variable. Một số literals quen thuộc với JS developer: Array literals, Numeric literals, Boolean literals (true/false), Object literals, RegExp literal, String literals
- Array literals: là danh sánh những expression hoặc là không có cái nào hết, mỗi 1 trong đó đại diện cho một thành phần của array, nằm trong một dấu ngoặc vuông
['item 1',,'item2',]
. Trong này tất cả phẩy đều sẽ được tính ngoại trừ dấu phẩy cuối a.k.a trailing comma, vì nó sẽ hỗ trợ xemgit diff
clean hơn khi trình bày một array bằng nhiều dòng.
- Array literals: là danh sánh những expression hoặc là không có cái nào hết, mỗi 1 trong đó đại diện cho một thành phần của array, nằm trong một dấu ngoặc vuông
- Phân biệt giữa
Loop
vàIteration
- Loop: Một đoạn code lặp đi lặp lại nhiều lần.
- Iteration: là tiến trình trong đó, thuật ngữ iteration tương đương một lần thực thi.
- Lexical scope: khả năng scope của một function có thể truy cập đến các variable của parent scope.
Tránh bị tấn công vô prototype bằng cách dùng hasOwnProperty
- Dùng
hasOwnProperty
để bảo vệ tránh prototype pollution - Kết hợp
hasOwnProperty
và hàmcall()
để tránh property pollution
VD:
var hasOwn = {}.hasOwnProperty; hasOwn.call(dict, "alice");
Dùng Array hơn là Dictionary đối với tập hợp có thứ tự
- Tránh phụ thuộc lên thứ tự khi dùng vòng lặp
for...in
khi lặp các thuộc tính đối tượng. - Nếu dùng phép aggregate data của một
Dictionary
, đảm bảo nó tính toán không dựa trên thứ tự - Đối với tập hợp có thứ tự, nên dùng array, không dùng dictionary
Không được thêm những thuộc tính Enumrable cho Object.prototype
- Không thêm thuộc tính vào
Object.prototype
- Nên viết một function they vì
Object.prototype.method
- Nếu muốn thêm property vào
Object.prototype
, dùngObject.defineProperty
để định nghĩa nó dưới dạng non-enumerable.
Tránh thay đổi object trong quá trình lặp for...in
- Không thay đổi object trong khi lặp những properties bằng vòng lặp
for...in
. - Nên dùng vòng lặp
while
hoặcfor
bình thường thay chofor...in
đối với content có thể thay đổi. - Để lặp qua cấu trúc dữ liệu thay đổi, nên dùng cấu trúc tuần tự như
Array
thay vì dùngDictionary
.
Những trường hợp nên dùng for
thay vì for...in
- Luôn luôn dùng for thay cho
for...in
để lặp qua những thuộc tính có index - Nên lưu thuộc tính
length
củaArray
vô một biến cục bộ trước khi lặp để tránh tính toán lại phép tìm kiếm.
Dùng những phương thức iteration
thay vì loop
- Dùng phương thức iteration nhu
Array.prototype.forEach
hoặcArray.prototype.map
thay cho các vòng lặp để giúp code dễ đọc hơn và tránh lặp logic điều khiển. - Dùng những hàm iteration custom để trừu tượng những common pattern để loop không có sẵn trong thư viện chuẩn
- Những vòng lặp truyền thống sẽ vẫn phù hợp trong trường hợp cần thoát ra sớm; thay vào đó, có thể dùng
some
, hoặcevery
cho việc thoát sớm.
Dùng phương thức generic của array cho những object giống Array
- Dùng lại những phương thức chung dánh cho Array bằng cách lấy riêng những method và dùng hàm call.
- Bất kỳ đối tương nào miễn có những thuộc tính index và có thuộc tính length đều có thể dùng với phương thức Array.
Nên dùng Array literals thay vì Array constructor.
- Một array nếu trong Array Constructor của nó chỉ khai báo toàn số nó sẽ tạo ra 1 array khác với suy nghĩ bình thường, nghĩa là:
- Nếu bạn tạo 1 array là những chuỗi
new Array("mot", "hai", "ba")
thì Javascript sẽ hiểu là một danh sách có 3 phần tử - Ngược lại nếu 1 array chỉ toàn số
new Array(3,4,5,6,7)
, Javascript sẽ dùng tham số đầu tiên sẽ gán cho độ dài của cái chuỗi. Nên, muốn khởi tạo một danh sách chỉ chứa numeric, dùng literals[3,4,5,6,7]
- Nếu bạn tạo 1 array là những chuỗi
References: