2016-07-16 267 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