typeof为`this`返回“object”,在其他地方返回“number”

时间:2013-12-17 13:54:20

标签: javascript

typeof在应用于不同上下文中的相同值时评估为不同的字符串。例如,这是预期的:

> typeof 5
'number'

...但是,通过typeof访问时5 this不一样:

> Number.prototype.foo = function () { return typeof this; };
[Function]
> (5).foo()
'object'

另一个(in)健全性检查,真的,认真核实this 是一个数字:

> Number.prototype.foo = function () { return [this + 1, typeof this]; };
[Function]
> (5).foo()
[ 6, 'object' ]

我已经阅读了MDN文档和typeof {{1}},并且无法想象这是如何预期的,永远不要正确。有人有解释吗?

2 个答案:

答案 0 :(得分:5)

这里的诀窍是你的测试用例将5更改为一个对象。

每当您访问原始值(布尔值,数字或字符串)的属性时,原始值将转换为适当类型的对象(布尔值,数字或字符串),并在该对象上解析属性访问。 / p>

我已就此主题撰写了更多内容herehere

显示类型的正确方法是:

Number.prototype.foo = function () { return typeof this.valueOf(); };
(5).foo() // "number"

当您执行this+1时,您的完整性检查会将对象包装器转换回原始值:

(new Number(5)) + 1 // 6

答案 1 :(得分:0)

我的猜测是(5)将基本类型number转换为Number个对象。

尝试添加如下函数:

Number.prototype.foo2 = function() { console.log(this); }

,在致电(5).foo2()后,您会在Chrome中收到类似的结果:

Number {foo: function, foo2: function}
    __proto__: Number
    [[PrimitiveValue]]: 5