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}},并且无法想象这是如何预期的,永远不要正确。有人有解释吗?
答案 0 :(得分:5)
这里的诀窍是你的测试用例将5更改为一个对象。
每当您访问原始值(布尔值,数字或字符串)的属性时,原始值将转换为适当类型的对象(布尔值,数字或字符串),并在该对象上解析属性访问。 / p>
显示类型的正确方法是:
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