Tôi hơi bối rối về Javascript không xác định & null.
Đừng nhầm lẫn về null
. Nó thường có ý nghĩa và hành xử tương tự như các khái niệm ngôn ngữ kịch bản khác về các đối tượng ngoài luồng 'null', 'nil' hoặc 'Không'.
undefined
, mặt khác, là một trò chơi JavaScript kỳ quặc. Đó là một đối tượng đơn lẻ đại diện cho các giá trị ngoài băng, về cơ bản là một thứ hai tương tự nhưng khác biệt null
. Nó đi lên:
Khi bạn gọi một hàm có ít đối số hơn danh sách đối số trong danh sách function
câu lệnh, các đối số không được bỏ qua được đặt thành undefined
. Bạn có thể kiểm tra điều đó với ví dụ:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Với phương pháp này, bạn không thể biết sự khác biệt giữa dosomething(1)
và dosomething(1, undefined)
; arg2
sẽ có cùng giá trị trong cả hai. Nếu bạn cần nói sự khác biệt mà bạn có thể nhìn vào arguments.length
, nhưng thực hiện các đối số tùy chọn như thế thường không dễ đọc.
Khi một chức năng không có return value;
, nó trả về undefined
. Nói chung không cần sử dụng kết quả trả lại như vậy.
Khi bạn khai báo một biến bằng cách có một var a
câu lệnh trong một khối, nhưng chưa gán giá trị cho nó, thì đó là undefined
. Một lần nữa, bạn không thực sự cần phải dựa vào điều đó.
typeof
Toán tử ma quái trả về 'undefined'
khi toán hạng của nó là một biến đơn giản không tồn tại, thay vì đưa ra một lỗi như thường xảy ra nếu bạn cố gắng tham chiếu đến nó. (Bạn cũng có thể cung cấp cho nó một biến đơn giản được gói trong ngoặc đơn, nhưng không phải là biểu thức đầy đủ liên quan đến biến không tồn tại.) Cũng không sử dụng nhiều cho điều đó.
Đây là một trong những tranh cãi. Khi bạn truy cập vào một thuộc tính của một đối tượng không tồn tại, bạn sẽ không gặp lỗi ngay lập tức như mọi ngôn ngữ khác. Thay vào đó bạn có được một undefined
đối tượng. (Và sau đó khi bạn cố gắng sử dụng undefined
đối tượng đó sau này trong tập lệnh, nó sẽ sai theo một cách kỳ lạ, khó theo dõi hơn nhiều so với việc JavaScript vừa ném lỗi ngay lập tức.)
Điều này thường được sử dụng để kiểm tra sự tồn tại của các thuộc tính:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Tuy nhiên, vì bạn có thể gán undefined
như bất kỳ giá trị nào khác:
o.prop= undefined;
điều đó không thực sự phát hiện liệu tài sản có ở đó một cách đáng tin cậy hay không. Tốt hơn là sử dụng in
toán tử, không có trong phiên bản JavaScript gốc của Netscape, nhưng hiện có sẵn ở mọi nơi:
if ('prop' in o)
...
Tóm lại, undefined
là một mớ hỗn độn dành riêng cho JavaScript, khiến mọi người bối rối. Ngoài các đối số chức năng tùy chọn, trong đó JS không có cơ chế thanh lịch nào khác, undefined
nên tránh. Nó không bao giờ nên là một phần của ngôn ngữ; null
sẽ chỉ hoạt động tốt đối với (2) và (3) và (4) là một hành vi sai trái chỉ tồn tại vì lúc đầu JavaScript không có ngoại lệ.
những gì if (!testvar)
thực sự làm gì? Nó kiểm tra cho không xác định và null hoặc chỉ không xác định?
Như một 'truthiness' kiểm tra thử nghiệm chống lại false
, undefined
, null
, 0
, NaN
và chuỗi rỗng. Nhưng trong trường hợp này, vâng, nó thực sự undefined
được quan tâm. IMO, cần nói rõ hơn về điều đó và nói if (testvar!==undefined)
.
một khi một biến được định nghĩa, tôi có thể xóa nó trở lại không xác định (do đó xóa biến).
Bạn chắc chắn có thể gán undefined
cho nó, nhưng điều đó sẽ không xóa biến. Chỉ có các delete object.property
nhà điều hành thực sự loại bỏ mọi thứ.
delete
là thực sự có nghĩa cho các thuộc tính chứ không phải là các biến như vậy. Các trình duyệt sẽ cho phép bạn thoát ra một cách thẳng thắn delete variable
, nhưng đó không phải là một ý tưởng hay và sẽ không hoạt động trong chế độ nghiêm ngặt của ECMAScript Fifth Edition. Nếu bạn muốn giải phóng một tài liệu tham khảo đến một cái gì đó để nó có thể được thu gom rác, thì sẽ là bình thường hơn để nói variable= null
.
Tôi có thể vượt qua không xác định như là một tham số?
Đúng.