2010-03-28 33 views
7

tôi đang làm một số thử nghiệm với dòng này JavaScript độc hại: var undefined = true;var undefined = true;

Mỗi biến chưa được khởi trong JavaScript có giá trị của undefined mà chỉ là một biến chứa các giá trị đặc biệt của 'undefined', vì vậy sau đây cần thực hiện alert:

var undefined = true, 
    x; 

if (x) { 
    alert('ok'); 
} 

Nhưng không, và câu hỏi của tôi là lý do tại sao?

Mở thử nghiệm hơn nữa, tôi thử như sau:

var undefined = true, 
    x = undefined; 

if (x) { 
    alert('ok'); 
} 

Thời gian này, alert được thực thi.

Vì vậy, câu hỏi của tôi là ... vì trong đoạn đầu tiên x giữ undefined (vì nó không được khởi tạo), tại sao không thực hiện alert? Điều kỳ lạ là khi tuyên bố rõ ràng rằng xundefined (x = undefined), các alert thực hiện ...

Trả lời

17

Có sự khác biệt giữa biến có tên undefined và giá trị được gọi là undefined.

var undefined = true, 
    x; 

Trong ví dụ này, biến undefined được thiết lập với giá trị true, và x với giá trị (không phải là biến!) undefined.

var undefined = true, 
    x = undefined; 

Trong ví dụ này, biến undefined được thiết lập với giá trị true là tốt, và x được thiết lập với giá trị chứa trong biến undefined (đó là true).

Vì vậy, trong khi bạn có thể khai báo biến có tên undefined, bạn không thể thay đổi thực tế là các biến không được khởi tạo được đặt thành giá trị undefined.

+0

Hehe; điều gì sẽ xảy ra nếu biến 'undefined' là giá trị' undefined'? – Pindatjuh

+3

@Pindatjuh: giống như biến có bất kỳ tên nào khác. Không có gì đặc biệt về một biến có tên là 'undefined'. – dtb

1

Chỉ cần khai báo một biến gọi là "không xác định" không có nghĩa là bạn đang trọng được xây dựng trong khái niệm về những gì giá trị "không xác định" gốc là.

Hãy tưởng tượng nếu Java cho phép bạn sử dụng "null" làm số nhận dạng. Vâng, tôi đoán Java không có sự ép buộc giống như Javascript. Dù sao câu lệnh Javascript

if (x) alert("foo"); 

liên quan đến sự ép buộc ngầm về giá trị "x" đến boolean. Giá trị không được xác định, do đó, giá trị của nó cho kết quả "boolean" trong false.

+0

@Andreas Grech - Bizarrely, '" \ n \ t "== true' cũng thực sự là' false'. – JulianR

+0

Thực ra, khái niệm đúng trong JavaScript là mọi giá trị ngoại trừ null, không xác định, chuỗi rỗng '', 'NaN',' 0' và 'false' –

0

Biến chưa được khởi tạo nhận giá trị đặc biệt undefined. Khi bạn gán một biến cho một biến khác, bạn cho nó một chuỗi tham chiếu biến mà bạn đã xác định trong phạm vi hiện tại. Trong trường hợp này, bạn đã xác định biến có tên là undefined do đó công cụ JavaScript sẽ trông đầu tiên thông qua các biến, xem bạn đã đặt tên một biến là undefined và sau đó gán biến đó.