Chính xác không xác định nghĩa là gì trong JavaScript? Tại sao nó ở đó? Nó có công dụng gì? Làm thế nào nó có thể hữu ích?


11

Trong JavaScript, chúng ta có một cái gì đó gọi là không xác định . Tôi đã nói điều gì đó, bởi vì tôi thực sự không biết liệu đó là một lớp cơ sở, hay một biến tích hợp, hay một từ khóa, hay bất cứ thứ gì khác. Tôi chỉ biết rằng nó ở đó.

Để xem nó trong hành động, bạn chỉ cần viết:

undefined;
typeof undefined;

Bất cứ ai có thể vui lòng giải thích cho tôi tại sao điều này đã được chèn vào JavaScript? Chúng tôi có nullgiá trị trong ngôn ngữ này, do đó nó không nên là một cái gì đó như thế null. Trong các ngôn ngữ khác, khi chúng tôi không biết giá trị của một thuộc tính hoặc biến, chúng tôi chỉ cần đặt nó thành null. Ở đây chúng ta có thể làm điều tương tự.

Làm sao chúng ta có thể sử dụng điều trong JavaScript?



Điều này đã được thảo luận về quảng cáo tại đây stackoverflow.com/questions/6999291/ Khăn
Paul

Câu trả lời:


13

Có HAI điều bạn cần hiểu về không xác định ...

  • các loại undefined mà có thể chỉ có một giá trị .
  • các biến undefined

Bây giờ hãy đọc những điều sau đây thật cẩn thận ...

  • Có rất nhiều giá trị của loại number(10, 10.01, 1e1). Nhưng chỉ có thể có một giá trị loại undefinedgiá trị đó được lưu trữ trong biến undefined. Giá trị đó có đại diện NO đen - ví dụ, các giá trị số 1, 100, 1e-1đều literals số loại, nhưng giá trị được lưu trữ trong biến undefinedkhông có hình chữ.

  • undefinedlà một biến, chỉ là một biến thông thường, JavaScript khai báo và gán cho nó giá trị của kiểu undefinedtrong phạm vi toàn cục. Vì vậy, bạn có thể làm tất cả những điều sau đây ...

  loại không xác định; // "chưa xác định"

  không xác định = 100;
  loại không xác định; // "con số"

  không xác định = void 0;
  loại không xác định; // "chưa xác định"

  window.und xác định === không xác định; // thật
  window.und xác định === void 0; // thật
  
  • nếu bạn không muốn sử dụng biến undefined, bạn có thể tạo giá trị của loại undefinedtheo biểu thức void 0- mục đích duy nhất của nó là trả về giá trị của loại undefined.

... bất cứ ai có thể giải thích cho tôi tại sao điều này đã được chèn vào JavaScript ...

KHÔNG. Giống như không ai có thể giải thích tại sao các biến không được khai báo đi đến phạm vi toàn cầu thay vì cục bộ. Bạn chỉ cần rèn luyện bản thân để sử dụng nó một cách thông minh thay vì cố gắng tìm ra lời biện minh cho sự tồn tại của nó.

... chúng tôi có giá trị null ...

Mặc dù nullcó thể làm mọi thứ undefined, nhưng nó ít nhiều liên quan đến objectshơn là vô hướng. Thật vậy, JavaScript nulltự coi mình là một đối tượng - typeof nulltrả về "đối tượng".

Theo tôi, điểm mấu chốt là KHÔNG cố gắng suy luận các mục đích tuyệt đối undefinednull- và sử dụng chúng trong mã của bạn một cách thông minh, để mã của bạn có thể đọc được, có thể duy trì và có thể sử dụng lại.


2
Giải thích tốt @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, có vẻ như JavaScript là một ngôn ngữ không phải là một ngôn ngữ logic và chúng ta chỉ cần làm quen với nó, giống như thử nghiệm một thế giới mới.
Saeed Neamati

1
"Có mục đích duy nhất là trả về giá trị của loại undefined". Thực tế voidđánh giá một biểu thức, bỏ qua giá trị trả về và trả về undefinedgiá trị. Đối với sự khác biệt. undefinedđược sử dụng bởi công cụ JS để nói rằng thứ này không có giá trị. nullđược BẠN sử dụng để nói rằng điều này không có giá trị. Có một sự phân biệt rõ ràng .
Raynos

1
undefined = 100; typeof undefined;trả về "không xác định" cho tôi, nếu bạn cố gán cho null bạn sẽ gặp lỗi. Chỉ muốn làm rõ rằng cho độc giả trong tương lai.
Josh Rumbut

6

Xin lỗi vì đã trả lời một câu hỏi cũ hơn nhưng lý do bạn cần cả không xác định và null rất đơn giản: trong ngôn ngữ gõ vịt dựa trên nguyên mẫu, bạn hoàn toàn phải phân biệt giữa "đối tượng này không xác định giá trị cho X" và "đối tượng này nói X là không có gì / null / trống ".

Không có khả năng này, không có cách nào để đi theo chuỗi nguyên mẫu và do đó, kế thừa không thể hoạt động; bạn phải có thể xác định rằng obj.someProp không được xác định để bạn có thể xem obj.prototype.someProp và chuyển lên chuỗi cho đến khi bạn tìm thấy giá trị. Nếu obj.someProp trả về null, sẽ không có cách nào để biết liệu nó thực sự là null hay chỉ có nghĩa là "nhìn vào nguyên mẫu của tôi". Cách duy nhất khác để giải quyết vấn đề này là tiêm một số ma thuật bẩn thỉu đằng sau hậu trường, phá vỡ khả năng làm mờ của bạn với chuỗi nguyên mẫu và thực hiện nhiều phép thuật khác của JS.

Giống như phần lớn Javascript, ban đầu, ý tưởng về không xác định và null có vẻ rất rắc rối và ngu ngốc, sau đó hoàn toàn xuất sắc sau đó (sau đó trở lại mạnh mẽ và ngu ngốc nhưng với một lời giải thích hợp lý).

Một ngôn ngữ như C # sẽ không biên dịch nếu bạn truy cập vào một thuộc tính không tồn tại và các ngôn ngữ động khác thường đưa ra ngoại lệ khi chạy khi bạn chạm vào một thuộc tính không tồn tại, nghĩa là bạn phải sử dụng các cấu trúc đặc biệt để kiểm tra chúng. Các lớp cộng có nghĩa là khi một đối tượng được khởi tạo, bạn đã biết chuỗi kế thừa của nó và tất cả các thuộc tính mà nó có - trong JS tôi có thể sửa đổi một nguyên mẫu 15 bước lên chuỗi và những thay đổi đó sẽ xuất hiện trên các đối tượng hiện có.


3

Có một biến toàn cục undefined, được đặt thành giá trị không xác định. Những người xấu xa có thể đặt nó vào một cái gì đó khác, vì vậy tốt nhất là không nên tin vào nó.

  • Giá trị không xác định là giá trị trả về của hàm không trả về giá trị.
  • Giá trị không xác định là giá trị của một biến chưa được chỉ định.
  • Giá trị không xác định là giá trị của một tham số chưa được thông qua.
  • Giá trị không xác định là giá trị của một tài sản chưa được chỉ định.
  • 'không xác định' là loại biến không được khai báo. ( typeof undeclaredVariable == 'undefined'. cố gắng đọc giá trị của biến bị thiếu sẽ khiến bạn bị ném ReferenceError.)

nulllà tinh tế bị phá vỡ, bởi vì typeof null == 'object'. Tôi không biết tại sao chúng ta có undefinednull, có lẽ là một tai nạn lịch sử.


2

Vâng, undefinedlà một giá trị sentinel thu được bằng cách đánh giá một cái gì đó không được xác định là trái ngược với null, đó là giá trị được xác định chính xác để đại diện cho không có gì .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Vì vậy, ví dụ, giá trị trả về của hàm, không xác định giá trị trả về là không xác định. Giá trị của một thuộc tính không được xác định trên một đối tượng là không xác định. Giá trị trả về của một câu lệnh, đó không phải là một biểu thức không được xác định (mặc dù bạn sẽ không thấy điều này xảy ra ngoài giao diện điều khiển).
Xin lưu ý rằng bạn có thể tạo một hàm, trả về một cách rõ ràng undefinedvà bạn có thể xác định rõ ràng một thuộc tính có giá trị undefinedtrên một đối tượng, vì cuối cùng nó là một giá trị hợp lệ. Bạn sẽ làm như vậy để giao tiếp rõ ràng, rằng một cái gì đó không được xác định .

Bạn có thể nghĩ về mối quan hệ của undefinednullnhư thế giữa NaN0.


"Giá trị trả về của một hàm, mà không xác định được giá trị trả về là undefined", bạn có nghĩa là undefinedvoid?
Saeed Neamati

@Saeed: Không hẳn. voidtrong JavaScript là một toán tử đơn nguyên , nhận bất kỳ đối số nào và trả về giá trị undefined .
back2dos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.