Biến là được khai báo nếu truy cập tên biến sẽ không tạo tham chiếu lỗi. Nếu biểu thức typeof variableName !== 'undefined'
sẽ false
chỉ theo một trong hai trường hợp:
- biến không được khai báo (ví dụ, không có
var variableName
trong phạm vi), hoặc
- biến được khai báo và giá trị của nó là
undefined
(tức là, giá trị của biến được không được định nghĩa)
Nếu không, việc so sánh để đánh giá true
.
Nếu bạn thực sự muốn kiểm tra nếu một biến được khai báo hay không, bạn sẽ cần phải catch
bất kỳ ReferenceError
sản xuất bằng cách giới thiệu với nó:
var barIsDeclared = true;
try{ bar; }
catch(e) {
if(e.name == "ReferenceError") {
barIsDeclared = false;
}
}
Nếu bạn chỉ đơn thuần muốn kiểm tra nếu giá trị một biến khai báo của không phải là undefined
cũng không null
, bạn chỉ có thể kiểm tra cho nó:
if(variableName !== undefined && variableName !== null) { ... }
Hoặc tương đương, với một tấm séc bình đẳng không nghiêm ngặt chống lại null
:
if(variableName != null) { ... }
Cả hai ví dụ thứ hai của mình và biểu hiện bên tay phải của bạn trong các bài kiểm tra hoạt động &&
nếu giá trị là "falsey", nghĩa là, nếu nó cưỡng ép để false
trong một bối cảnh boolean. Các giá trị như vậy bao gồm null
, false
, 0
và chuỗi rỗng, không phải tất cả các chuỗi mà bạn có thể muốn hủy.
Tại sao 'window.variableName'? Nếu biến là cục bộ, biến đó sẽ không được xác định ngay cả khi biến được xác định. –
Ngoài ra, là "không null" là trực giao cho dù giá trị của biến là 'false'. –
Coffeescript có toán tử riêng cho vấn đề này và mã JS được tạo ra từ nó khá thú vị. http://stackoverflow.com/questions/9992620/coffeescript-existential-operator-and-this –