Tại sao là đối tượng null null null đối tượng?


241

Tôi đang đọc 'Javascript chuyên nghiệp dành cho nhà phát triển web' Chương 4 và nó cho tôi biết rằng năm loại nguyên thủy là: không xác định, null, boolean, số và chuỗi.

Nếu nulllà một người nguyên thủy, tại sao typeof(null)trở lại "object"?

Điều đó có nghĩa là điều đó nullđược truyền qua tham chiếu (tôi giả sử ở đây tất cả các đối tượng được truyền bằng tham chiếu), do đó làm cho nó KHÔNG phải là nguyên thủy?


50
Trả lời: Bởi vì thông số kỹ thuật nói như vậy. Điều này thường được coi là một sai lầm.
SLaks

5
Lưu ý, typeof là một toán tử, không phải là một hàm (và trên thực tế bạn có thể bỏ qua các dấu ngoặc đơn xung quanh những gì xuất hiện sau nó), vì vậy sẽ không có ý nghĩa gì khi nói về việc chuyển qua tham chiếu ở đây. Cuốn sách "JavaScript: Các bộ phận tốt" thực sự đề cập đến thực tế là loại null === 'đối tượng' trong phần A.6 của phụ lục A có tên 'Các bộ phận khủng khiếp'.
John Sonderson

5
Tôi nghĩ rằng tôi muốn đọc 'Phần khủng khiếp' hah
austinheiman

1
sai lầm lớn, khôn lường! :)
Alexander Mills

2
Vậy chúng ta nên sử dụng cái gì thay vì typeof để kiểm tra loại giá trị mà một biến đang giữ? Tôi muốn biết nó nằm giữa (boolean, chuỗi, số, mảng, đối tượng, hàm, ký hiệu, null, không xác định, NaN)
Costa

Câu trả lời:


219

Từ trang MDN về hành vi của typeofnhà điều hành :

null

// Điều này đứng từ khi bắt đầu JavaScript
typeof null === 'đối tượng';

Trong lần triển khai JavaScript đầu tiên, các giá trị JavaScript được biểu diễn dưới dạng thẻ loại và giá trị. Thẻ loại cho các đối tượng là 0. nullđược biểu diễn dưới dạng con trỏ NULL (0x00 trong hầu hết các nền tảng). Do đó, null có 0 là thẻ loại, do đó typeofgiá trị trả về "đối tượng" . ( tham khảo )

Một bản sửa lỗi đã được đề xuất cho ECMAScript (thông qua chọn tham gia), nhưng đã bị từ chối . Nó sẽ có kết quả trong typeof null === 'null'.


137
Thật xấu hổ vì sự thay đổi này ít nhất đã biến nó thành chế độ nghiêm ngặt
Ingo Bürk

Mọi người đã và đang tận dụng lợi thế của trò chơi, và nhiều mã ngoài đó sẽ phải được thay đổi nếu điều này không bị từ chối, tôi đoán
Cold Cerberus

Nó có ý nghĩa hơn đối với một số ít người sống muốn thay đổi mã của họ, hơn những nhà phát triển còn lại trong thời gian còn lại phải học nó. Chỉ vì một người chưa tồn tại, không nhất thiết có nghĩa là họ không quan trọng, điều đó chỉ có nghĩa là họ không phòng bị.
Seph Reed

không có lý do tại sao mọi người sẽ sử dụng điều này như là một kiểm tra null. Nó không có ý nghĩa trực quan vậy tại sao họ sẽ sử dụng nó? Bây giờ thay đổi không thể được thêm vào vì mã hóa xấu.
Emobe

69

Nếu nulllà một người nguyên thủy, tại sao typeof(null)trở lại "object"?

Bởi vì thông số kỹ thuật nói như vậy .

11.4.3 Các typeofđiều hành

Sản phẩm UnaryExpression : typeof UnaryExpression được đánh giá như sau:

  1. Đặt val là kết quả của việc đánh giá UnaryExpression .
  2. Nếu Loại ( val ) là Tham chiếu , thì
       a. Nếu IsUnresolvableReference ( val ) là đúng , trả về " undefined".
       b. Đặt valGetValue ( val ).
  3. Trả về một chuỗi được xác định bởi Loại ( val ) theo Bảng 20.

nhập mô tả hình ảnh ở đây


@peter không typeofcho bạn biết gì về việc bạn có thể gọi các phương thức trên một cái gì đó hay không.
Matt Ball

2
Theo hiểu biết của tôi, bạn có thể gọi các phương thức trên bất cứ thứ gì khác ngoài nullundefined.
Matt Ball

4
@peter bạn không thể gọi các phương thức trên một chuỗi nguyên thủy, nhưng rất may là các nguyên hàm chuỗi (và các nguyên hàm số và các nguyên hàm boolean) được ngầm định và tự động "đóng hộp" trong các hàm bao Chuỗi, Số và Boolean khi bạn sử dụng một trong các nguyên hàm có thuộc tính toán tử tham chiếu ( .hoặc [ ]).
Mũi nhọn

28

Như đã được chỉ ra, thông số kỹ thuật nói như vậy. Nhưng vì việc triển khai JavaScript có trước khi viết thông số ECMAScript và đặc tả kỹ thuật này cẩn thận không sửa lỗi cho việc triển khai ban đầu, vẫn còn một câu hỏi chính đáng về lý do tại sao nó được thực hiện theo cách này ngay từ đầu. Douglas Crockford gọi đó là một sai lầm . Kiro Risk nghĩ rằng nó khá là hợp lý :

Lý do đằng sau điều này là null, ngược lại undefined, thường (và vẫn là) thường được sử dụng khi các vật thể xuất hiện. Nói cách khác, nullthường được sử dụng để biểu thị một tham chiếu trống đến một đối tượng. Khi Brendan Eich tạo JavaScript, anh ta cũng theo mô hình tương tự, và nó có ý nghĩa (có thể nói là) để trả lại "đối tượng". Trong thực tế, đặc tả ECMAScript định nghĩa nullgiá trị nguyên thủy đại diện cho sự vắng mặt có chủ ý của bất kỳ giá trị đối tượng nào (ECMA-262, 11.4.11).


3
Vì bây giờ tôi không thể tìm thấy video tôi sẽ đăng video này chỉ dành cho những người tò mò và không có bất kỳ tài liệu tham khảo nào: Crockford đã giải thích cách giá trị 0 trong việc giải quyết loại null chỉ vào phần tử được lập chỉ mục bằng 0 trên mảng loại, vì vậy điều này rõ ràng phát triển lỗi mà các anh chàng Microsoft đã vô tình phát tán khi dịch ngược và biên dịch lại JS cho trình duyệt của họ
Áxel Costas Pena

6

Từ cuốn sách YDKJS

Đây là một lỗi lâu đời trong JS, nhưng một lỗi có thể sẽ không bao giờ được sửa chữa. Quá nhiều mã trên Web phụ thuộc vào lỗi và do đó sửa nó sẽ gây ra nhiều lỗi hơn!


1
đừng tin tất cả mọi thứ được viết trong một cuốn sách. Tôi thực sự thích cuốn sách đó, tuy nhiên, tôi không thể coi đó là một lỗi vì đặc tả ECMA cho trạng thái JavaScript rằng loại null phải là một đối tượng.
andreasonny83

4

Nếu nulllà nguyên thủy, tại sao typeof(null)lại trả về " object"?

Nói tóm lại: đó là lỗi trong ECMAScript và loại nên là null

tham khảo: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null


1
Không nơi nào trong tài liệu tham khảo của bạn nói rằng đó là một lỗi.
dùng2867288

1
Và không có thông số nào nói rằng typeof sẽ trả về bất cứ thứ gì ngoại trừ "không xác định", "đối tượng", "boolean", "số", "chuỗi", "hàm" và "biểu tượng" (ECMAScript 2015)
Brad Kent

1

Trong JavaScript null là "không có gì". Nó được coi là một cái gì đó không tồn tại. Thật không may, trong JavaScript, kiểu dữ liệu null là một đối tượng. Bạn có thể coi đó là một lỗi trong JavaScript mà typeof null là một đối tượng. Nó sẽ là null.


0

Trong JavaScript, typeof null là 'object', điều này gợi ý không chính xác rằng null là một đối tượng. Đây là một lỗi và không may là không thể sửa được, vì nó sẽ phá vỡ mã hiện có.


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.