2012-01-01 54 views
10

Dưới đây là một câu hỏi trong JavaScript dưới đây:Tại sao "foo" .toString() không giống với toString.call ("foo")?

// Tested via Google Chrome console. 
var toString = Object.prototype.toString; 

"foo".toString(); // "foo" 
toString.call("foo"); // [object String] 

[].toString(); // "" 
toString.call([]); // [object Array] 

{}.toString(); // syntax error 
toString.call({}); // [object Object] 

Tại sao kết quả của toString là khác nhau với toString.call()?

CẬP NHẬT

String.prototype.toString.call("foo"); // "foo" 
Object.prototype.toString.call("foo"); // [object String] 

là String.prototype.toString không từ chuỗi mẫu như dưới đây?

toString trong String [không tìm thấy] -> toString trong String.prototype [không tìm thấy]

      --> toString in Object.prototype[found] 
+0

Không phải là một chuyên gia về javascript, nhưng tôi nghi ngờ nó đã làm với cách gọi một chức năng được xác định trước và đi qua nó một tham số null như trái ngược với gọi một hàm trên một đối tượng không tồn tại. – bdares

+0

Làm thế nào để bạn kiểm tra các kết quả đó? Bảng điều khiển trình duyệt hoặc cái gì khác? –

+0

@ShadowWizard Bảng điều khiển trình duyệt Chrome. –

Trả lời

16

String.prototype.toString ghi đè Object.prototype.toString. Họ không phải là chức năng tương tự.

Từ specification of String.prototype.toString:

Returns Chuỗi giá trị này. (Lưu ý rằng, đối với một đối tượng String, các toString phương pháp xảy ra để trả lại điều tương tự như valueOf phương pháp.)

Object.prototype.toString:

Khi toString phương pháp là được gọi là, các bước sau được thực hiện:

  1. Hãy để O là kết quả của việc gọi ToObject chuyển giá trị này làm đối số.
  2. Hãy để lớp là giá trị của thuộc tính nội bộ [[Class]] của O.
  3. trả về chuỗi giá trị đó là kết quả của concatenating ba Strings "[đối tượng", lớp, và "]".

Mảng cư xử tương tự, họ cũng ghi đè toString():

> [1,2].toString() 
    "1,2" 
4
>>> String.prototype.toString.call("foo") 
"foo" 

Object không phải là điều tương tự như một String.

+0

Có phải phương thức ** toString ** của chuỗi là từ 'Chuỗi .__ proto__' không? Và 'String .__ proto__' phải là' Object', vậy tại sao ** toString ** trong String không bằng ** toString ** trong Object? –

+1

Có, nhưng Chuỗi ghi đè đối tượng ToString để hiển thị bản in thân thiện hơn chỉ với [Object X]. Nếu nó không ghi đè lên mặc định toString suy nghĩ của bạn sẽ là đúng. –

-1

Chức năng toàn cầu toString khác với chức năng object.toString(). Theo this source, chức năng toàn cầu toString không được xác định rõ ràng và do đó được triển khai không đúng trên các trình duyệt khác nhau. Về cơ bản, nó cung cấp chức năng tương tự như toán tử typeof.

+0

các toString OP được đề cập không phải là không được xác định "toàn cầu toString", nhưng rất được xác định là "var toString = Object.prototype.toString" bởi OP –

+0

Đôi mắt của tôi phải đã vượt qua dòng đầu tiên của mã . Xin lỗi. – Jivings

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