为什么"foo".toString()与toString.call("foo")不同?

pat*_*ide 11 javascript

以下是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]
Run Code Online (Sandbox Code Playgroud)

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

更新

String.prototype.toString.call("foo"); // "foo"
Object.prototype.toString.call("foo"); // [object String]
Run Code Online (Sandbox Code Playgroud)

String.prototype.toString不是来自原型链,如下所示?

字符串中的toString [未找到] - > String.prototype中的toString [未找到]

                           --> toString in Object.prototype[found]
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 17

String.prototype.toString覆盖Object.prototype.toString.它们的功能不同.

从规范String.prototype.toString:

返回此String值.(注意,对于String对象,toString方法碰巧返回与valueOf方法相同的东西.)

而且Object.prototype.toString:

当的toString方法被调用,则采取以下步骤:

  1. 设O是调用ToObject传递此值作为参数的结果.
  2. 设class为O的[[Class]]内部属性的值.
  3. 返回String值,该值是连接三个字符串" [object ",class和" ] "的结果.

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

> [1,2].toString()
  "1,2"
Run Code Online (Sandbox Code Playgroud)