Lỗi phổ biến trong JavaScript
- Trang trước Tuyệt chiêu JS
- Trang tiếp theo Hiệu suất JS
Chương này nêu ra một số lỗi phổ biến trong JavaScript.
sử dụng ngẫu nhiên toán tử gán
nếu nhà phát triển sử dụng ngẫu nhiên toán tử gán trong if
sử dụng ngẫu nhiên toán tử gán trong=
)thay vì toán tử so sánh (====
),chương trình JavaScript có thể tạo ra một số kết quả không thể预料.
điều này if
câu lệnh trả về false
(như mong đợi),vì x không bằng 10:
var x = 0; if (x == 10)
điều này if
câu lệnh trả về true
(thích như không mong đợi),vì 10 là true:
var x = 0; if (x = 10)
điều này if
câu lệnh trả về false
(thích như không mong đợi),vì 0 là false:
var x = 0; if (x = 0)
Gán giá trị luôn trả về giá trị được gán.
mong đợi so sánh lỏng lẻo
trong so sánh thông thường, loại dữ liệu không quan trọng. Câu lệnh này if
câu lệnh trả về true
:
var x = 10; var y = "10"; if (x == y)
trong so sánh chặt chẽ, loại dữ liệu thực sự quan trọng. Câu lệnh này if
câu lệnh trả về false
:
var x = 10; var y = "10"; if (x === y)
Một lỗi phổ biến là quên trong switch
câu lệnh sử dụng so sánh chặt chẽ:
điều này switch
câu lệnh sẽ hiển thị hộp thông báo:
var x = 10; switch(x) { case 10: alert("Hello"); }
điều này switch
câu lệnh sẽ không hiển thị hộp thông báo:
var x = 10; switch(x) { case "10": alert("Hello"); }
cộng và gộp lại gây hiểu lầm
cộngdùng đểsố。
gộp lại (Concatenation)dùng đểchuỗi。
Trong JavaScript, cả hai loại toán này đều sử dụng cùng một +
ký hiệu toán
Vì vậy, việc cộng số dưới dạng số với số dưới dạng chuỗi sẽ产生不同的结果:
var x = 10 + 5; // Kết quả trong x là 15 var x = 10 + "5"; // Kết quả trong x là "105"
Nếu cộng hai biến, kết quả khó dự đoán:
var x = 10; var y = 5; var z = x + y; // Kết quả trong z là 15 var x = 10; var y = "5"; var z = x + y; // Kết quả trong z là "105"
Điểm gây hiểu lầm về số thập phân
Số nguyên trong JavaScript đều được lưu trữ dưới dạng 64 bitSố thập phân (Floats)。
Tất cả các ngôn ngữ lập trình, bao gồm cả JavaScript, đều gặp khó khăn trong việc xử lý giá trị thập phân:
var x = 0.1; var y = 0.2; var z = x + y // kết quả trong z không phải là 0.3
Để giải quyết vấn đề trên, hãy sử dụng phép nhân chia:
Mô hình
var z = (x * 10 + y * 10) / 10; // kết quả trong z sẽ là 0.3
Down dòng chuỗi JavaScript
JavaScript cho phép bạn xuống dòng câu lệnh thành hai dòng:
Ví dụ 1
var x = "Hello World!";
Nhưng, xuống dòng trong giữa chuỗi là không đúng:
Ví dụ 2
var x = "Hello World!";
Ví dụ 3
var x = "Hello \ World!";
Dấu chấm phẩy không đúng vị trí
Vì một dấu chấm phẩy không đúng, khối mã này sẽ thực thi bất kể giá trị của x là gì:
if (x == 19); { // khối mã }
Down dòng câu lệnh return
Việc tự động đóng lại câu lệnh ở cuối dòng là hành vi mặc định của JavaScript.
Vì vậy, hai ví dụ sau đây sẽ trả về kết quả tương tự:
Ví dụ 1
function myFunction(a) { var power = 10 return a * power }
Ví dụ 2
function myFunction(a) { var power = 10; return a * power; }
JavaScript cũng cho phép bạn xuống dòng câu lệnh thành hai dòng.
Vì vậy, ví dụ 3 cũng sẽ trả về kết quả tương tự:
Ví dụ 3
function myFunction(a) { var power = 10; return a * power; }
Nhưng, nếu bạn đặt return
Sự việc gì sẽ xảy ra nếu câu lệnh xuống dòng thành hai dòng?
Ví dụ 4
function myFunction(a) { var power = 10; return a * power; }
Hàm này sẽ trả về undefined
!
Vậy tại sao? Bởi vì JavaScript cho rằng bạn muốn:
Ví dụ 5
function myFunction(a) { var power = 10; return; a * power; }
Giải thích
Nếu một câu lệnh không hoàn chỉnh:
var
JavaScript sẽ hoàn thành câu lệnh này bằng cách đọc dòng tiếp theo:
power = 10;
Nhưng do câu lệnh này là hoàn chỉnh:
return
JavaScript sẽ tự động đóng lại câu lệnh này:
return;
Vì vậy, việc sử dụng dấu chấm phẩy để đóng (kết thúc) câu lệnh trong JavaScript là tùy chọn.
JavaScript sẽ đóng lại ở cuối dòng. return
câu lệnh, vì nó chính là một câu lệnh hoàn chỉnh.
Vậy, tuyệt đối không nên đối với return
Câu lệnh được thực hiện xuống dòng.
Truy cập vào mảng thông qua chỉ mục đặt tên
Nhiều ngôn ngữ lập trình hỗ trợ mảng có chỉ số đặt tên.
Mảng có chỉ số đặt tên được gọi là mảng liên kết (hoặc hash).
JavaScript Không hỗ trợMảng có chỉ số đặt tên.
Trong JavaScript,MảngSử dụngChỉ số số:
Mô hình
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length sẽ trả về 3 var y = person[0]; // person[0] sẽ trả về "Bill"
Trong JavaScript,Đối tượngSử dụngChỉ số đặt tên。
Nếu bạn sử dụng chỉ số đặt tên, khi truy cập vào mảng, JavaScript sẽ định nghĩa lại mảng thành đối tượng tiêu chuẩn.
Sau khi tự động khôi phục lại, phương thức hoặc thuộc tính mảng sẽ tạo ra kết quả undefined hoặc không chính xác:
Mô hình
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length sẽ trả về 0 var y = person[0]; // person[0] sẽ trả về undefined
Dùng dấu phẩy để kết thúc định nghĩa
Dấu phẩy cuối cùng trong định nghĩa đối tượng và mảng là hợp lệ trong ECMAScript 5.
Mô hình đối tượng:
person = {firstName:"Bill", lastName:"Gates", age:62,}
Mô hình mảng:
points = [35, 450, 2, 7, 30, 16,];
Cảnh báo!!
Internet Explorer 8 sẽ bị sập.
JSON không cho phép dấu phẩy cuối cùng.
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62}
JSON:
points = [35, 450, 2, 7, 30, 16];
Undefined không phải là Null
Đối tượng JavaScript, biến, thuộc tính và phương thức có thể là undefined.
Ngoài ra, giá trị của đối tượng JavaScript rỗng có thể là null
。
Điều này có thể làm khó khăn để kiểm tra đối tượng có rỗng hay không.
Bạn có thể kiểm tra loại có phải là undefined
Để kiểm tra đối tượng có tồn tại hay không:
Mô hình
if (typeof myObj === "undefined")
Nhưng bạn không thể kiểm tra đối tượng có phải là null
vì nếu đối tượng không định nghĩa, sẽ ném lỗi:
Sai:
if (myObj === null)
Để giải quyết vấn đề này, bạn phải kiểm tra đối tượng có phải là null
được thay thế bởi undefined.
Nhưng điều này vẫn sẽ gây ra lỗi:
Sai:
if (myObj !== null && typeof myObj !== "undefined")
Do đó, trước khi kiểm tra không null, bạn phải kiểm tra không định nghĩa:
Đúng:
if (typeof myObj !== "undefined" && myObj !== null)
mong đợi phạm vi khối
JavaScript khôngtạo ra phạm vi mới cho mỗi khối mã.
Nhiều ngôn ngữ lập trình đều như vậy, nhưng JavaScript Không phải vậy。
cho rằng đoạn mã này sẽ trả về undefined
,là lỗi phổ biến của người phát triển JavaScript mới:
Mô hình
for (var i = 0; i < 10; i++) { // Khối mã } return i;
- Trang trước Tuyệt chiêu JS
- Trang tiếp theo Hiệu suất JS