【问题标题】:What is "[object type]"什么是“[对象类型]”
【发布时间】:2016-07-16 20:20:21
【问题描述】:

toString() 返回“[对象类型]”,因此toString.call(new Date) 返回[object Date]toString.call(new String) 返回[object String]。我很好奇“[object type]”的性质是什么:它不可能是一个数组,正如 [] 的使用所暗示的那样;如果它是一个对象,{type: object} 不是更丰富的语法吗?如果是字符串,为什么不直接返回例如“type”,其中 type 是对象的类型,例如 DateString

【问题讨论】:

  • 这种行为没有特别的原因,除了它是原始实现所做的。它就是这样工作的,并且无法更改,因为大量软件都依赖于它。
  • 如前所述,toString 返回一个包含左括号、构造函数、类型和右括号的字符串。括号没有特殊含义,它们不是数组,只是specification 所说的应该返回的方式。
  • 注意你所说的“类型”不是type。在 ES5 中是内部的 [[Class]],在 ES6 中则更复杂。

标签: javascript object tostring


【解决方案1】:

这正是 javascript 语言规范所说的 toString 方法应该做的事情

  1. 如果 this 值未定义,则返回“[object Undefined]”。如果 此值为空,返回“[object Null]”。
  2. 令 O 为调用 ToObject 的结果,并将 this 值传递为 论据。
  3. 令 class 为 O 的 [[Class]] 内部属性的值。
  4. 返回作为连接结果的字符串值 三个字符串“[object”、class 和“]”。

oriol 指出 ECMASCRIPT 2015(也称为 ES6)使 toString 方法更加复杂。它找出它处理的对象类型的方式有点冗长。你可以看到新的规范here Source

【讨论】:

  • 注意 ES6 已移除 [[Class]],现在是 a bit more complicated
  • const letsBreakJQuery = {[Symbol.toStringTag]: 'Array'}; - 让我们打破一些库:)
  • @Oriol 更新了答案以包含指向新规范的链接以及它处理对ToString的调用的方式
  • ToObject 是如何调用的?为了测试我试过: var ob=new Object(); var O=ob.ToObject(this) 或 var cl=ob.ToObject(this)[[Class]],得到 'ob.ToObject 不是函数'。
  • @TreefishZhang 你必须打电话给Object.prototype.toString.call(<your object here>)。例如let num = 1; Object.prototype.toString.call(num); 给你'[object Number]'
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2020-10-02
相关资源
最近更新 更多