2015-04-22 82 views
0

return toString.call(obj)return obj.toString()有什么区别?将toString与toString进行比较

我经常发现这些不同风格的

+0

关键的区别不在于性能,而在于'toString!== obj.toString'的可能性。告诉我们更多关于'toString'和'obj'的信息,我们将能够回答你的问题... – Bergi

+0

[toString()方法返回一个代表对象的字符串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) – ozil

+0

这些片段返回不同的字符串。 – undefined

回答

1

toString.call(obj)返回对象的类型代码,而obj.toString()返回对象的字符串表示,或者如果它没有执行这个函数对象的类型。

实施例:

var a = [5]; 
a.toString() // "5" 
toString.call(a) // "[object Array]" 

更多细节可以在MDN找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

使用的toString()来检测对象类:

var toString = Object.prototype.toString; 

toString.call(new Date); // [object Date] 
toString.call(new String); // [object String] 
toString.call(Math);  // [object Math] 

// Since JavaScript 1.8.5 
toString.call(undefined); // [object Undefined] 
toString.call(null);  // [object Null] 

UnderscoreJS使用toString.call(obj)代替typeOf,因为它是更快:

_.isNumber = function(obj) { 
    return toString.call(obj) == '[object Number]'; 
}; 
+2

像这样使用'toString'是我见过的最糟糕的全局对象... – Bergi

+0

它只是用来举个例子! – SpartakusMd

+0

你应该解释一下它究竟是什么,它是如何工作的,以及它会如何做得更好:-) – Bergi

1

当你打电话给toString.call(obj)你实际上正在做的是调用window.toString(call)这就是说你正在调用应用于你的对象obj的全局对象的toString函数。

当您调用obj.toString()时,您可以调用实际对象的toString函数,该函数可能在本地实现 - 例如,用于序列化或演示目的 - 或者原型链上的某处。

试试这个:
toString === window.toString; // true

编辑:
在Node.js的全局对象实际上是所谓global,在浏览器中它仍将window

+0

只是要精确 - 全局对象不是_always_'window',只能在浏览器中运行。 –

+0

确实@JamesThorpe。 – Cros