Biến toàn cục
Biến toàn cục được hỗ trợ trong nhiều ngôn ngữ khác nhau. Việc sử dụng biến toàn cục, vì là biến dùng chung, nếu không cẩn thận sẽ dẫn đến những kết quả không như mong đợi. Vấn đề sẽ không có gì để nói nếu biến toàn cục là được phép sử dụng (dùng hay không dùng tuỳ ý) trong các ngôn ngữ, nhưng với JavaScript thì là bắt buộc hay yêu cầu phải dùng.
Phạm vi
JavaScript không hỗ trợ phạm vi block nên lời khuyên tốt nhất là khai báo biến (toàn cục) tại đỉnh của mỗi hàm.
Chèn dấu chấp phẩy (;) tự động
JavaScript hỗ trợ cơ chế chèn dấu chấm phẩy (;) tự động để sửa lỗi chương trình. Cơ chế này là tốt nhưng nếu lạm dụng sẽ dẫn tới nhiều kết quả không như mong đợi. Ví dụ đoạn mã sau:
return 1 ;
JavaScript sẽ tự động thêm dấu ; vào đoạn mã trên (và chúng ta không được thấy) như sau:
return; 1 ;
Kết quả trả về sau khi thêm dấy ; là undefined.
Đoạn mã trên viết đúng sẽ là :
return 1;
hay lợi dụng khả năng thêm dấu chấm phẩy của JavaScript viết như sau:
return 1
typeof
toán tử typeof trả về kiểu dữ liệu của một giá trị. Ví dụ:
return typeof true; // giá trị trả về là boolean
Tuy nhiên, vấn đề lớn nhất và chúng ta phải cẩn thận khi dùng là typeof không phân biệt được null và object. Đoạn mã sau sẽ trả về object:
return typeof null; // giá trị trả về là object
null là một trong những giá trị ít được ưa thích trong các ngôn ngữ lập trình nên việc không phân biệt được null và object là một đặc điểm không tốt lắm của typeof.
parseInt
Hàm parseInt dùng để chuyển một chuỗi thành một số nguyên (mặc định là cơ số 10). Ví dụ parseInt (“16”) = 16 (cơ số 10) và nếu parseInt (“16”, 8) = 14 vì trong cơ số 8. Trong cuốn sách JavaScript: The good parts, Douglas Crockford đã nêu một nhược điểm của hàm parseInt là sẽ tự động chuyển các chuỗi bắt đầu bằng kí tự 0 sang cơ số 8 nếu chúng ta không cung cấp cơ số cho nó, ví dụ parseInt(“08”) = 0, tuy nhiên nhược điểm này đã được khắc phục và kết quả trên vẫn là 8.
Một nhược điểm khác của parseInt thể hiện qua ví dụ parseInt (“16 abc”) = 16 mà không cung cấp thêm thông tin nào về phần abc.
Toán tử +
Toán tử + trong JavaScript rất đa năng có thể là phép cộng hay phép kết hợp chuỗi. Điều này thường gây bối rối cho người học khi phải dùng toán tử này. Xét một vài ví dụ sau để thấy tính đa năng của toán tử này:
“ ” + 5 = 5 // kết hợp một chuỗi rỗng và một số kết quả là một chuỗi “7” + 5 = 75 // kết hợp một chuỗi và một số kết quả là một chuỗi 7 + 5 = 12 // cộng một số với một số kết quả là một số
Điểm chấm động
Xét kết quả phép tính 0.1 + 0.2. kết quả mong đợi sẽ là 0.3 tuy nhiên kết quả lại là 0.30000000000000004 để phù hợp với chuẩn IEEE 754. Khắc phục vấn đề điểm chấm động trong JavaScript có nhiều giải pháp tuỳ theo vấn đề của ứng dụng, ví dụ phép cộng 0.1 + 0.2 sẽ dùng Math.round như sau:
Math.round((0.1 + 0.2)*100)/100; // kết quả 0.3
NaN
Là một giá trị đặc biệt được định nghĩa bởi IEEE 754. NaN viết tắt của Not a Number mặc dù lệnh sau có giá trị true:
typeof NaN === 'number' // kết quả là true
Câu lệnh trên toán tử typeof không phân biệt được NaN và số và chỉ ra rằng NaN không bằng chính bản thân nó. Kết quả sau sẽ khiến bạn ngạc nhiên:
NaN === NaN; // false NaN !== NaN; // true
Bạn có thể dùng các phương thức như isNaN hay isFinite khi tính toán để tránh một số bật tiện do NaN gây ra.
Mảng
Trong JavaScript không có cấu trúc mảng thật sự (do đó còn gọi là mảng giả (phony array)) và rất dễ dùng (không yêu cầu chiều hay báo lỗi vi phạm kích cỡ). Tuy nhiên, toán tử typeof không phân biệt được mảng và object, kết quả đoạn mã sau là true:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; typeof fruits === 'object' // kết quả là true
Do đó, trong nhiều trường hợp cần dùng thuộc tính constructor hay phương thức propertyIsEnumerable để phân biệt mảng và đối tượng.
Giá trị false
Giá trị fasle trong JavaScript có nhiều hình thức tuỳ theo kiểu giá trị như bảng sau:
Do có nhiều hình thức nên đôi khi gây sự khó khăn cho người lập trình.
hasOwnProperty
hasOwnProperty là một phương thức chứ không phải toán tử nên trong đối tượng, nó có thể được thay thế bởi một phương thức khác hay thậm chí một giá trị.
Đối tượng
Các đối tượng trong JavaScript không bao giờ rỗng do nguyên tắc prototype chain, điều này đôi khi gây ra những kết quả không như mong đợi.
Toán tử ==
JavaScript cung cấp các toán tử so sánh bằng gồm ==, !=, ===, !==. Lời khuyên là nên sử dụng === và !== thay vì dùng == và !=.
Lệnh with
with là một cách truy cập nhanh chóng đến các thuộc tính của đối tượng. Không nên lạm dụng lệnh with vì đôi khi chúng ta sẽ không biết chính xác những gì mình đã làm.
Hàm eval
Hàm eval là một trong những hàm dùng sai phổ biến cho những người bắt đầu làm quen JavaScript. Cần cẩn thận khi dùng hàm này.
Từ khoá new, void
JavaScript cung cấp toán tử new để tạo đối tượng mới, toán tử void nhận một toán hạng và trả về undefined. Cả hai toán tử này được khuyên không nên sử dụng vì sự phiền toái hay những vô ích mà chúng mang lại.
Ý kiến bài viết