Tôi tin rằng lý do cho việc sử dụng cả nil và null là vì trước đây chủ yếu là một danh từ và sau này chủ yếu là một tính từ (tôi đã kiểm tra trên web và trong từ điển giấy của tôi: American Heritage 1992).
Về ý nghĩa và lịch sử, NIL là một sự co lại từ "nihil" trong tiếng Latin có nghĩa là "không có gì".
Theo hiểu biết của tôi, việc sử dụng tên nil
để biểu thị một con trỏ null được giới thiệu với ngôn ngữ lập trình Lisp (1958).
Một con trỏ null là một giá trị con trỏ được cho là không trỏ đến, và do đó không nên bị hủy đăng ký. Trong hầu hết các trường hợp, con trỏ chỉ đơn giản là địa chỉ bộ nhớ. Bất kỳ biến nào (nghĩa là bất kỳ vị trí nào) được dự định chứa một con trỏ như vậy sẽ luôn chứa một số cấu hình của các bit và bất kỳ cấu hình nào như vậy có thể được đọc dưới dạng địa chỉ bộ nhớ. Do đó, thông thường giá trị nil
sẽ là địa chỉ của vùng nhớ bị cấm đối với chương trình, do đó gây ra một số dạng lỗi (có thể bị gián đoạn) nếu chương trình cố gắng hủy đăng ký nil
, chỉ có thể là lỗi.
Có một giá trị tiêu chuẩn được xác định trước duy nhất để đóng vai trò này là điều cần thiết trong các ngôn ngữ sử dụng con trỏ một cách rõ ràng, vì điều quan trọng là có thể kiểm tra xem một con trỏ có đang chỉ vào một vị trí bộ nhớ hay không. Thông thường, trong Lisp, một danh sách được xây dựng như một chuỗi các "khuyết điểm" chứa con trỏ "xe hơi" đến một thành phần danh sách và con trỏ "cdr" cho cặp tiếp theo. Trong cặp cuối cùng của danh sách, con trỏ thứ hai là nil
.
Điều này tương ứng với định nghĩa đệ quy của danh sách là danh sách trống hoặc thành phần danh sách được nối với danh sách. Do đó một danh sách không có yếu tố được đại diện bởi nil
. Danh sách trống này xảy ra là danh tính của danh sách đơn.
Vì danh sách có thể được sử dụng để biểu diễn các tập hợp, nên tập hợp trống có thể được đại diện bởi nil
.
Do đó, nil
về mặt lịch sử là một giá trị con trỏ đặc biệt, nhưng được hiểu là một giá trị nhận dạng đặc biệt cho các miền trừu tượng khác, chẳng hạn như danh sách hoặc bộ.
Một con trỏ bằng nil
là một con trỏ null, null là một tính từ chứ không phải là một từ thực chất (tức là một danh từ).
Việc sử dụng phối hợp cả hai từ, như tính từ và danh từ khá phù hợp với thực tiễn khác. Null vòng loại thường được sử dụng cho số không của cấu trúc đại số, chẳng hạn như danh tính của một đơn chất: phần tử null . Danh sách tạo thành một monoid , trong đó giá trị nil là danh tính. Điều tương tự cũng đúng với các tập hợp (mặc dù chúng tạo thành một đại số với nhiều thuộc tính hơn). Người ta nói tương tự rằng một số nguyên là null khi nó bằng không.
Có rất nhiều biến thể về việc sử dụng những từ này một từ khác, chẳng hạn như không, tùy thuộc vào tác giả và đặc điểm riêng của ngôn ngữ lập trình.
Hai ý nghĩa chính là , như đã giải thích ở trên
như một "giá trị không xác định" tiêu chuẩn, thực sự đại diện cho sự vắng mặt của bất kỳ giá trị có thể sử dụng nào.
làm giá trị nhận dạng của một số miền
Điều này cho thấy không hoàn toàn chính xác khi khẳng định rằng NIL là " một giá trị đại diện cho sự vắng mặt của một giá trị ", như được thực hiện bởi Gilles trong câu trả lời được chấp nhận . Nó phụ thuộc vào ngôn ngữ và cách sử dụng. Các lập trình LISP ngôn ngữ có thể giới thiệu NIL trong thuật ngữ lập trình 55 năm về trước. Trong LISP, NIL
là danh sách trống và có thể được ghi chú tương ứng ()
, đó là đại diện tự nhiên của danh sách trống.Nó không đại diện cho sự vắng mặt của một giá trị. Đôi khi, nó được sử dụng làm trình giữ chỗ cho các giá trị bị thiếu, mặc dù điều đó thường được tránh chính xác vì danh sách trống là một giá trị. Những gì đại diện cho một giá trị còn thiếu trong một cấu trúc trong bất kỳ đối tượng tùy ý, được chọn bởi lập trình viên, không thể nhầm lẫn với các giá trị chấp nhận được.
Hai khái niệm khá khác nhau, mặc dù chúng tôi đã chỉ ra ở trên rằng chúng có thể liên quan với nhau. Thật thú vị khi có một chế độ phân loại chi tiết về việc sử dụng thuật ngữ được liệt kê bởi Gilles'answer, để xem liệu cách sử dụng của mỗi từ này được định hướng nhiều hơn theo nghĩa này hay nghĩa khác.
Tên không nhiều hơn những gì chúng được gán có nghĩa trong một bối cảnh nhất định, bởi bất cứ ai đang xác định diễn ngôn. Một số cách sử dụng phổ biến hơn, tự nhiên hơn hoặc nhất quán hơn, nhưng người ta phải luôn kiểm tra các định nghĩa và đảm bảo ý nghĩa nào được dự định trong mỗi bối cảnh. Và người ta không nên luôn luôn mong đợi thuật ngữ đã được lựa chọn với hương vị hoặc tính nhất quán.
NULL
(cho khả năng tương thích C) vànil
; gọi phương thức trênnil
là không có. JavaScript có cảnull
(một giá trị không đại diện cho gì) vàundefined
(giá trị thậm chí không được đặt).