Effective Javascript: Chủ đề Array và Dictionary post thumbnail image

Effective Javascript: Chủ đề Array và Dictionary

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 property
      Enumerable 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ùng Object.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:
  • 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ợ xem git diff clean hơn khi trình bày một array bằng nhiều dòng.
  • Phân biệt giữa LoopIteration
    • 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àm call() để 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ùng Object.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ặc for bình thường thay cho for...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ùng Dictionary.

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ủa Array 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ặc Array.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ặc every 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]

References:

Leave a Reply

Related Post