2016-07-16 270 views
0

toString()返回「[object type]」,以便toString.call(new Date)返回[object Date]toString.call(new String)返回[object String]。我很好奇「[對象類型]」的本質是什麼:它不可能是一個數組,因爲使用[]意味着;如果它是一個對象,不會{type: object}是一個更具信息性的語法?如果它是一個字符串,爲什麼不只是返回例如「type」,其中type是對象的類型,如DateString什麼是「[對象類型]」

+1

這種行爲沒有什麼特別的原因,除了它原來的實現。它就是這樣工作的,因爲大量的軟件依賴於它,所以它不能改變。 – Pointy

+1

如上所述,'toString'返回一個包含左括號,構造函數,類型和右括號的字符串。括號沒有特殊含義,它們不是數組,它只是[**規範**](http://www.ecma-international.org/ecma-262/5.1/#sec-15.2。 4.2)表示應該退回。 – adeneo

+0

注意你所說的「類型」不是[類型](http://www.ecma-international.org/ecma-262/6.0/#sec-type)。在ES5中,它是內部的[[Class]],在ES6中更復雜一些。 – Oriol

回答

3

這正是JavaScript語言規範說toString方法應該做

  1. 如果這個值是不確定的,回報「[對象未定義]」。如果 該值爲空,則返回「[object Null]」。
  2. 令O是調用ToObject傳遞這個值作爲 論證的結果。
  3. 設類是[[類]]內部O.
  4. 返回字符串值,該值是串接 三個字符串的結果的屬性的值「[對象」,類,和「]」。

作爲oriol尖的EcmaScript 2015(也稱爲ES6)方面的toString方法有點複雜。它發現它處理的對象類型的方式有點冗長。你可以看到新的規格here Source

+1

注意ES6已被刪除[[Class]],現在[稍微複雜一點](http://www.ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)。 – Oriol

+0

'常量letsBreakJQuery = {[Symbol.toStringTag]:「陣」};' - 讓打破一些庫:)更新了答案 –

+0

@Oriol包括一個鏈接到新的規範,它處理成'ToString'呼叫的方式 – eltonkamami