2010-10-28 34 views
27

Nếu bạn nhìn vào đặc tả ECMAScript 3, bạn sẽ thấy rằng các kiểu giá trị nguyên thủy Null và Undefined không có các đối tượng Null và Undefined.Tại sao chữ số không có quyền truy cập vào các phương thức Số?

>> Null 
ReferenceError: Null is not defined 

Các loại giá trị nguyên thủy khác Số, chuỗi và loại Boolean có đi kèm với các đối tượng Số, Chuỗi và Boolean mà bạn có thể tham chiếu từ phạm vi toàn cục.

>>Number 
function Number() { [native code] } 
>>Boolean 
function Boolean() { [native code] } 

Mục đích cho các kiểu giá trị nguyên thủy là cung cấp các phương pháp như toStringvalueOf với nhiều loại giá trị nguyên thủy của mình:

>>var n = 1; 
>>n.toString(); 
"1" 

cũng giống như

>>var n = 1; 
>>Number.prototype.toString.call(n); 
"1" 

Booleans và các chuỗi cũng hoạt động theo cách đó:

>>var b = true; 
>>b.toString(); 
"true" 
>>Boolean.prototype.toString.call(b); 
"true" 

Bạn có thể thấy rằng các đối tượng giá trị nguyên thủy đang sử dụng các phương pháp của đối tượng đi kèm của họ khi bạn cố gắng kết hợp các loại:

>>Boolean.prototype.toString.call(n); 
TypeError: Boolean.prototype.toString is not generic 
>>Number.prototype.toString.call(b) 
TypeError: Number.prototype.toString is not generic 

Điều thú vị là đủ với nhiều loại đen boolean và chuỗi, bạn có thể gọi các phương pháp này trực tiếp từ các chữ:

>>true.toString(); 
"true" 
>>Boolean.prototype.toString.call(true) 
"true" 
>>"moo".toString(); 
"moo" 
>>String.prototype.toString.call("moo") 
"moo" 

giá trị nguyên thủy null và undefined, vì họ không có kèm theo đối tượng Null và không xác định không thể làm những điều sau:

>>Null 
ReferenceError: Null is not defined 
>>null.toString() 
TypeError: Cannot call method 'toString' of null 

Số loại giá trị nguyên thủy hoạt động giống như kết hợp cả hai. Bạn có thể gọi toString trên một chữ nếu bạn trực tiếp sử dụng phương pháp của Số đối tượng nguyên mẫu của:

>>Number.prototype.toString.call(1); 
"1" 

Nhưng bạn không thể truy cập vào phương pháp này từ nghĩa đen chính nó như bạn có thể với chuỗi và boolean:

>>1.toString() 
SyntaxError: Unexpected token ILLEGAL 

Tại sao nó có phải là số lượng literal hoạt động khác với boolean và string mặc dù có một đối tượng Number không?

+0

xem thêm [Tại sao tôi không thể truy cập thuộc tính của một số nguyên bằng một dấu chấm?] (http://stackoverflow.com/q/9380077/1048572) – Bergi

+0

Oh, điểm tốt. Không chắc lắm. Bài đăng khác đó có thông tin tốt. Cảm ơn! –

Trả lời

33

Bạn thể truy cập nó theo cùng một cách, đó là một vấn đề phân tích khác nhau ở đây, để làm điều đó, sử dụng một cú pháp hơi khác nhau:

(1).toString() 

số có thể có số thập phân, vì vậy cú pháp cho kết thúc bằng một số thập phân hơi mơ hồ khi bạn đi phân tích mã, sử dụng dấu ngoặc đơn hợp lệ. Đó là một chút rõ ràng hơn khi bạn thấy rằng đây cũng là hợp lệ:

(1.).toString() 

Tuy nhiên chỉ với 1.toString() nó đang cố gắng để phân tích như một số với một số thập phân, và nó không thành công.

+0

Không xem xét thử bằng(). Ước gì tôi có thể đánh dấu hai câu trả lời là câu trả lời. Về cơ bản, chữ có thuộc tính, nhưng bạn chỉ phải đối phó với cú pháp thập phân phụ. Cảm ơn! –

+7

1..toFixed (2), 1.0.toFixed (2) làm việc mà không có parens. – kennebec

+0

@kennebec - Vâng, chúng sẽ hoạt động tốt, tôi đã truyền đạt nhiều hơn rằng '(anyType) .toString()' sẽ là một định dạng phù hợp sẽ hoạt động, xin lỗi nếu điều đó không hoàn toàn rõ ràng ... không có nghĩa là ngụ ý không có lựa chọn thay thế cho các con số cụ thể. –

5

Tôi nghĩ bạn sẽ tìm thấy câu trả lời cho câu hỏi của mình trong this answer cho một câu hỏi về Stack Overflow khác.Để tóm tắt câu trả lời của Theo:

[T]he parser expects a number followed by a dot to be a floating point literal. [...] [Y]ou only have to add another dot to make it work[.]

+0

Wow! Tôi nghĩ nó có liên quan đến số thập phân, nhưng tôi nghĩ sẽ có nhiều thứ hơn. Thú vị, thấy tôi vui vì tôi đã hỏi. –

0

Null (capital N) là tên biến. Các từ dành riêng phân biệt chữ hoa chữ thường. null là đối tượng null. typeof null === "object" // true

+0

'null.toString()' -> * Uncaught TypeError: Không thể đọc thuộc tính 'toString' của null * –

Các vấn đề liên quan