比较toString

时间:2015-04-22 10:55:11

标签: javascript

return toString.call(obj)return obj.toString()之间的区别是什么?

我通常会找到具有这些不同风格的代码

2 个答案:

答案 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