2010-03-25 6 views
24

Theo http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf, JavaScript có 6 loại: undefined, null, boolean, string, numberobject.loại Javascript

var und; 
console.log(typeof und); // <-- undefined 

var n = null; 
console.log(typeof n); // <--- **object**! 

var b = true; 
console.log(typeof b); // <-- boolean 

var str = "myString" 
console.log(typeof str); // <-- string 

var int = 10; 
console.log(typeof int); // <-- number 

var obj = {} 
console.log(typeof obj); // <-- object 

Câu hỏi 1:

Tại sao là null loại object thay vì null?

Câu hỏi 2:

gì về chức năng?

var f = function() {}; 
console.log(typeof f); // <-- function 

Biến số f có loại function. Tại sao nó không được chỉ định trong đặc điểm kỹ thuật như một loại riêng biệt?

Cảm ơn,

+3

+1 cho đào trong spec, tìm kiếm sự giác ngộ toàn diện. –

Trả lời

13

Về typeof null == 'object', đây là một sai lầm mà đến từ những ngày đầu, và tiếc là sai lầm này sẽ ở lại với chúng tôi trong một thời gian dài, đó là too late được cố định trong 5 ECMAScript bản Thông số kỹ thuật.

Giới thiệu về các chức năng , chúng chỉ là đối tượng, nhưng chúng có một đặc tính nội bộ đặc biệt tên là [[Call]] được sử dụng nội bộ khi hàm được gọi.

Toán tử typeof phân biệt giữa các đối tượng thuần túy và hàm chỉ bằng cách kiểm tra xem đối tượng có thuộc tính nội bộ này hay không.

5

Đó là vì typeof được xác định để trở về "đối tượng" nếu đầu vào là null, và trở về "chức năng" nếu đầu vào là callable. (Xem 11.4.3 Nhà điều hành typeof.)

Tôi không biết tại sao tiêu chuẩn được xác định như thế này (and Crockford said it's wrong). Có thể tương thích ngược.

0

trả lời Trả lời câu số 1:

Một tài sản, khi nó không có nghĩa là không xác định. Lý do null là một đối tượng để một thuộc tính có thể tồn tại mà không có giá trị nào vẫn có định nghĩa.

+1

Thực ra tôi nghĩ đó là loại gây hiểu nhầm. Có sự khác biệt giữa không xác định và không khai báo. Ví dụ, 'var x' sẽ đặt một thuộc tính có tên' x' trong phạm vi hiện tại, nhưng giá trị của nó sẽ là 'undefined'. Trước khi điều này xảy ra, 'x' chính nó là không xác định, và cố gắng sử dụng nó sẽ dẫn đến một' tham sốError'. – bcherry

+1

Ngoài ra, 'null' là * không * một đối tượng, nó là * giá trị nguyên thủy *, đáng buồn là toán tử' typeof' chỉ sai ... – CMS

0

typeof null === "object" vì thông số nói như vậy, nhưng đây là một sai lầm từ phiên bản JavaScript đầu tiên. (như KennyTM đã nói ở trên).

typeof f === "function" vì, không có try/catch, không có cách nào đáng tin cậy, đáng tin cậy khác để xác định xem điều gì đó có thể gọi được hay không. Sử dụng f.constructor === Functioncó thể hoạt động, nhưng tôi nghĩ rằng nó không đảm bảo được như vậy.

0

Để hoàn chỉnh, lưu ý thực hành tốt nhất cách hiện tại để kiểm tra thông tin loại là một cái gì đó như thế này:

var typeInfo = Object.prototype.toString.call(yourObject); 

Cung cấp cho bạn một chuỗi trông giống như "[đối tượng Something]", trong đó "Something" là tên kiểu.

+0

'Object.prototype.toString.call (undefined)' cho tôi '[ đối tượng Window] 'trong Firefox o_O. – kennytm

+0

KennyTM: Đó là vì khi 'null' hoặc' undefined' được sử dụng làm đối số đầu tiên của 'call' hoặc' apply', ngữ cảnh (từ khóa 'this') bên trong hàm được gọi sẽ được đặt thành đối tượng chung. – CMS

+0

Quyền - nếu sử dụng kỹ thuật đó, bạn có thể thực hiện thử nghiệm === rõ ràng cho không xác định trước – Pointy

0

null là một giá trị đặc biệt - nó không phải là sai, nó không phải là 0, hoặc chuỗi rỗng hoặc NaN hoặc không xác định.

null là những gì bạn nhận được khi bạn tìm kiếm một đối tượng không có ở đó- không phải là thuộc tính không xác định của đối tượng, mà chính là điều đó.

đoạn văn có một textNode sẽ trả về giá trị rỗng cho các nút nextSibling, regexp không khớp với giá trị null thay vì mảng và cứ tiếp tục như vậy.

có thể phải có loại riêng, nhưng sau đó bắt đầu là thứ gì đó, một thứ gì đó có loại, thay vì không có đối tượng.

0

Ngoài ra còn có Array.prototype.

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford nói không sử dụng :

  • Số mới()
  • new String()
  • new Boolean()