Lỗi phổ biến trong JavaScript

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) 

Thử ngay

đ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) 

Thử ngay

đ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) 

Thử ngay

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) 

Thử ngay

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) 

Thử ngay

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");
}

Thử ngay

đ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");
}

Thử ngay

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"

Thử ngay

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"

Thử ngay

Đ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

Thử ngay

Để 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

Thử ngay

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!";

Thử ngay

Nhưng, xuống dòng trong giữa chuỗi là không đúng:

Ví dụ 2

var x = "Hello
World!";

Thử ngay

Ví dụ 3

var x = "Hello \
World!";

Thử ngay

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ã
}

Thử ngay

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
}

Thử ngay

Ví dụ 2

function myFunction(a) {
    var power = 10;
    return a * power;
}

Thử ngay

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;
}

Thử ngay

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;
}

Thử ngay

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;
}

Thử ngay

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"

Thử ngay

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

Thử ngay

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")

Thử ngay

Nhưng bạn không thể kiểm tra đối tượng có phải là nullvì 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)

Thử ngay

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;

Thử ngay