Object.prototype.toString.call和typeof之间有什么不同

时间:2015-07-16 16:34:19

标签: javascript

我是javascript的noob,我很困惑以下方法的区别。

function foo(){};
var bar = new Object();

Object.prototype.toString.call(foo).slice(8, -1);    // output "Function"
typeof foo;                                          // output "function"

Object.prototype.toString.call(bar).slice(8, -1);    // output "Object"
typeof bar;                                          // output "object"

3 个答案:

答案 0 :(得分:2)

您无法覆盖从typeof

返回的内容



var MyObject = function() { };
MyObject.prototype.toString = function() { return undefined; }
var x = new MyObject();

console.log(typeof x);
console.log(x.toString());




如果您对JavaScript的方法感兴趣,请查看MDN:

MDN typeof

MDN toString

答案 1 :(得分:1)

toString'hack'最常见的应用是弄清楚你正在处理的对象类型:

typeof(new Array())  === "object";
typeof(new Date())   === "object";
typeof(new RegExp()) === "object";

Object.prototype.toString.call(new Array()).slice(8, -1)  === "Array";
Object.prototype.toString.call(new Date()).slice(8, -1)   === "Date";
Object.prototype.toString.call(new RegExp()).slice(8, -1) === "RegExp";

例如,jQuery 1.11将其用于check whether a given object is an array。现代浏览器支持jQuery 2及更高版本uses the native Array.isArray

此外,在很多情况下,两者会返回不同的结果,最常见的是在原始类型周围使用对象包装器时:

typeof(new Number(5)) === "object";
Object.prototype.toString.call(new Number(5)).slice(8, -1) === "Number";

typeof(new String("hi")) === "object";
Object.prototype.toString.call(new String("hi")).slice(8, -1) === "String";

答案 2 :(得分:0)

toString()是一种方法,它返回表示当前对象的字符串(例如:Function)。你可以覆盖它以返回你想要的任何东西。

typeof 是一名运营商。您可以使用它来获取对象类型(作为字符串)。你不能像其他语言一样改变(重载)它。