return toString.call(obj)
和return obj.toString()
之间的区别是什么?
我通常会找到具有这些不同风格的代码
答案 0 :(得分: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]';
};
答案 1 :(得分:1)
当您调用toString.call(obj)
时,您实际在做的是调用window.toString(call)
,也就是说您正在调用应用于对象obj
的全局对象的toString函数。
当您调用obj.toString()
时,您调用实际对象的toString函数,该函数可能在本地实现 - 例如用于序列化或表示目的 - 或原型链上的某个地方。
试试这个:
toString === window.toString; // true
编辑:
在node.js中,全局对象实际上被称为global
,在浏览器中它将保持window
。