我今天有一个惊喜,我找不到规范的适当部分,以确定这是否是预期的。我的钱是there's nothing wrong with the universe,但是这个表达式的评估规则是什么
(function(){ return this;}).call(1) === 1
答案 0 :(得分:8)
使此表达式求值为false的规则是什么
在“松散”模式下,this
的值始终强制为对象。 Object类型的值不是(严格)等于Number类型的值(或者任何其他类型的值):
new Number(1) === 1 // false
来自spec:
输入功能代码
- 如果功能代码为strict code,请将ThisBinding设置为 thisArg 。
- 如果 thisArg null 或未定义,则将ThisBinding设置为全局对象。
- 如果Type( thisArg )不是对象,请将ThisBinding设置为ToObject( thisArg )。 ...
醇>
答案 1 :(得分:2)
原语1在 .call 中设置为 this 时转换为 Number对象,因为 this 在javascript中总是一个对象。
[Number:1] 与 1 原语不完全相同(===)。
但是当使用非严格相等运算符(==)时,数字对象将转换为基元进行比较。
答案 2 :(得分:0)
取决于'strict mode';
in strict mode: true (type is number)
without strict mode: false (type is object)
答案 3 :(得分:0)
尝试检查该功能的结果:
(function(){ return this;}).call(1)
你可以看到结果是Number {[[PrimitiveValue]]:1}所以结果是一个对象不是一个原始类型。由于您使用三个等号,因此请求类型相同:
(function(){ return this;}).call(1) === 1 // => FALSE
(function(){ return this;}).call(1) == 1 // => TRUE
这不是javascript相信我的最奇怪的事情; - )
答案 4 :(得分:0)
(function(){ return this;}).call(1)
返回类型为Number
的Object:
虽然1
属于原始类型。