2012-01-01 80 views
10

这里是JavaScript的以下问题:为什么“foo”.toString()与toString.call(“foo”)不一样?

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

不是一个JavaScript专家,但我怀疑它与调用预定义的函数,并传递一个null参数,而不是做在一个不存在的对象上调用一个函数。 – bdares 2012-01-01 11:55:27

+0

你如何检查这些结果?浏览器控制台,还是别的? – 2012-01-01 11:55:50

+0

@ShadowWizard Chrome浏览器控制台。 – 2012-01-01 12:02:26

回答

16

String.prototype.toString优先Object.prototype.toString。它们不是同一个功能。

specification of String.prototype.toString

返回此字符串值。 (需要注意的是,对于一个String对象,该的toString方法恰好返回同样的事情的valueOf方法。)

而且Object.prototype.toString

的toString方法所谓,采取以下步骤:

  1. Ø是调用ToObject传递这个值作为参数的结果。
  2. 类别的[[Class]]内部属性的值。
  3. 返回字符串值,该值是串接三个字符串的结果“[对象,和“]”。

阵列的行为相似,而且还覆盖toString()

> [1,2].toString() 
    "1,2" 
4
>>> String.prototype.toString.call("foo") 
"foo" 

对象不是一回事为一个字符串。

+0

String的** toString **方法来自“String .__ proto__”吗?而'String .__ proto__'应该是'Object',那么为什么String中的** toString **不等于Object中的** toString **? – 2012-01-01 12:16:14

+1

是的,但String重写Object toString以显示比[Object X]更友好的打印输出。如果它没有覆盖默认的toString,你的想法就是对的。 – 2012-01-01 12:19:57

-1

全局toString函数与object.toString()函数不同。 根据this source,全局的toString函数没有很好的定义,因此在不同浏览器中实现的效果很差。本质上它提供了与typeof操作员相似的功能。

+0

toString OP引用的不是没有明确定义的“全局toString”,而是由OP – 2012-01-01 12:26:47

+0

定义为“var toString = Object.prototype.toString”,我的眼睛必须经过第一行代码。道歉。 – Jivings 2012-01-01 12:32:27

相关问题