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

时间:2012-01-01 11:52:57

标签: 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]

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

已更新

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

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

  字符串中的

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

                           --> toString in Object.prototype[found]

3 个答案:

答案 0 :(得分:16)

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

来自specification of String.prototype.toString

  

返回此String值。 (注意,对于String对象, toString 方法会返回与 valueOf 方法相同的内容。)

Object.prototype.toString

  

调用 toString 方法时,将执行以下步骤:

     
      
  1. O 成为调用ToObject传递 this 值作为参数的结果。
  2.   
  3. class O 的[[Class]]内部属性的值。
  4.   
  5. 返回String值,该值是连接三个字符串“ [object ”, class 和“] ”的结果。< / LI>   

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

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

答案 1 :(得分:4)

>>> String.prototype.toString.call("foo")
"foo"

对象与字符串不同。

答案 2 :(得分:-1)

全局toString函数与object.toString()函数不同。 根据{{​​3}},全局toString函数定义不明确,因此在不同的浏览器中实现得很糟糕。基本上它提供了与typeof运算符类似的功能。