1可能不等于1

时间:2015-06-18 20:03:35

标签: javascript ecmascript-5

我今天有一个惊喜,我找不到规范的适当部分,以确定这是否是预期的。我的钱是there's nothing wrong with the universe,但是这个表达式的评估规则是什么

(function(){ return this;}).call(1) === 1

5 个答案:

答案 0 :(得分:8)

  

使此表达式求值为false的规则是什么

在“松散”模式下,this的值始终强制为对象。 Object类型的值不是(严格)等于Number类型的值(或者任何其他类型的值):

new Number(1) === 1 // false

来自spec

  

输入功能代码

     
      
  1. 如果功能代码为strict code,请将ThisBinding设置为 thisArg
  2.   
  3. 如果 thisArg null 未定义,则将ThisBinding设置为全局对象。
  4.   
  5. 如果Type thisArg )不是对象,请将ThisBinding设置为ToObject( thisArg )。   ...
  6.   

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

根据FF开发者控制台,

(function(){ return this;}).call(1)返回类型为Number的Object:

enter image description here

虽然1属于原始类型。