【问题标题】:Why "foo".toString() is not the same as toString.call("foo")?为什么 "foo".toString() 和 toString.call("foo") 不一样?
【发布时间】:2012-01-01 11:52:56
【问题描述】:

下面是 JavaScript 中的一个问题:

// 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]

为什么 toString 的结果与 toString.call() 不同?

更新

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

String.prototype.toString 不是来自下面的原型链吗?

toString in String[not found] --> toString in String.prototype[not found]

                           --> toString in Object.prototype[found]

【问题讨论】:

  • 不是 javascript 专家,但我怀疑这与调用预定义函数并传递空参数有关,而不是在不存在的对象上调用函数。
  • 您如何检查这些结果?浏览器控制台,还是别的什么?
  • @ShadowWizard Chrome 浏览器控制台。
  • 我还以为只是浏览器显示不好,但看来我错了,对不起。

标签: javascript


【解决方案1】:

String.prototype.toString 覆盖 Object.prototype.toString。它们不是同一个功能。

来自specification of String.prototype.toString

返回此字符串值。 (请注意,对于 String 对象,toString 方法恰好返回与 valueOf 方法相同的内容。)

还有Object.prototype.toString

当调用toString方法时,会采取以下步骤:

  1. O 成为调用 ToObject 并传递 this 值作为参数的结果。
  2. classO 的 [[Class]] 内部属性的值。
  3. 返回由三个字符串“[object”、class和“]”连接而成的字符串值。

数组的行为相似,它们也覆盖toString()

> [1,2].toString()
  "1,2"

【讨论】:

    【解决方案2】:
    >>> String.prototype.toString.call("foo")
    "foo"
    

    对象与字符串不同。

    【讨论】:

    • String的toString方法来自String.__proto__对吗?而String.__proto__应该是Object,那么为什么String中的toString不等于Object中的toString呢?
    • 是的,但是 String 会覆盖 Objects toString 以显示比 [Object X] 更友好的打印输出。如果它没有覆盖默认 toString 你的想法是正确的。
    【解决方案3】:

    全局toString 函数与object.toString() 函数不同。 根据this source 的说法,全局toString 函数定义得不是很好,因此在不同的浏览器中实现得很糟糕。本质上,它提供类似于typeof 运算符的功能。

    【讨论】:

    • toString OP 所指的不是定义不明确的“全局 toString”,而是被 OP 很好定义为“var toString = Object.prototype.toString”
    • 我的眼睛一定已经跳过了第一行代码。道歉。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2020-04-10
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多