2013-03-17 32 views
7

Tại sao 2..toString() trả lại 2 nhưng 2.toString() ném lỗi này?Tại sao 2..toString() hoạt động?

Ví dụ:

console.log(2..toString()); // prints 2 

// Firefox throws the error 
// `SyntaxError: identifier starts immediately after numeric literal` 
console.log(2.toString()); 

var x = 2; 
console.log(x.toString()); // prints 2 

// Firefox throws the error 
//`TypeError: XML descendants internal method called on incompatible Number` 
console.log(x..toString()); 
+0

(2) .toString() mang lại kết quả mong đợi. (không phải là câu trả lời mà là một bài kiểm tra ...) –

+0

Liệu IE có đưa ra lỗi không? – DevelopmentIsMyPassion

+0

Tôi biết nhưng tại sao '2..toString()' cũng hoạt động? –

Trả lời

4

2 chỉ là một số, nó không có bất kỳ phương thức nào để gọi.

2. có thể bị ép buộc thành một chuỗi, là một đối tượng (ví dụ: '2.0'), do đó có thể có phương pháp.

Chỉ 2.toString() sẽ được phân tích cú pháp là 2.0tostring(), tất nhiên điều này không có ý nghĩa.

Nhìn vào cách hai được phân tích cú pháp:

enter image description here

vs

enter image description here

Các công cụ để tạo những là ở đây bằng cách này: http://jsparse.meteor.com/

+3

công cụ đó là gì? –

+0

** Tìm thấy nó. Công cụ ở đây (http://jsparse.meteor.com/)** –

+2

bạn có thể vui lòng giải thích cách biểu đồ chỉ ra rằng te đầu tiên là sai? cả hai dường như trong một hộp số. Tôi không thể thấy các sơ đồ giúp như thế nào .... bạn có thể trả lời không? –

8

Đó là bởi vì 2. được phân tách như 2.0, vì vậy 2..toString() tương đương với 2.0.toString(), đó là một biểu thức hợp lệ.

Mặt khác, 2.toString() được phân tích cú pháp là 2.0toString(), đây là lỗi cú pháp.

+0

'2.' sản lượng' 2' trong bảng điều khiển của Chromium. –

+0

@ G.Kayaalp, yup, cả hai '2 === 2,0' và' 2. === 2.0' là 'true'. –

+0

ghét phải là người ủng hộ ma quỷ ở đây, nhưng '2. === 2' là 'true' cũng như –

1

2..toString() sẽ được hiểu là 2.0.toString().

Trên thực tế, 2. là một con số: console.log(typeof 2.); sẽ được cung cấp cho: số

2

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toString

Như đối tượng Số ghi đè phương thức toString của đối tượng Object, trước tiên bạn phải explicity sử dụng ngoặc đơn để chỉ ra rằng nó là một số và không phải là một đối tượng.

Đoán của tôi là 2. ngầm định nghĩa nó là một phao, sau đó có thể sử dụng phương thức .toString() của đối tượng Số và không phải là phương pháp của đối tượng Đối tượng.

4
2.toString() 

Thông dịch viên thấy 2 và nghĩ rằng, "oh, số!" Sau đó, nó thấy dấu chấm và suy nghĩ, "oh, một số thập phân!" Và sau đó, nó đi đến nhân vật tiếp theo và thấy một t, và nó bị lẫn lộn. "2.t không phải là một số thập phân hợp lệ", nó nói, vì nó ném một lỗi cú pháp.


2..toString() 

Các thông dịch viên thấy 2 và nghĩ rằng, "oh, một số!" Sau đó, nó thấy dấu chấm và suy nghĩ, "oh, một số thập phân!" Sau đó, nó thấy một dấu chấm khác và nghĩ, "ồ, tôi đoán đó là phần cuối của số của chúng ta. Bây giờ, chúng ta đang xem xét các thuộc tính của đối tượng này (số 2.0)." Sau đó, nó gọi phương thức toString của đối tượng 2.0.

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