1 大概不等于 1

1 presumably not equal to 1

我今天遇到了一个惊喜,我找不到规范的适当部分来确定这是否是预期的。我的钱花在了那个 there's nothing wrong with the universe 上,但是使这个表达式计算为 false

的规则是什么
(function(){ return this;}).call(1) === 1

what are the rules that make this expression evaluate to false

在"loose" 模式下,this 的值总是被强制转换为一个对象。 Object 类型的值不(严格)等于 Number 类型(或与此相关的任何其他类型)的值:

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

来自spec

Entering Function Code

  1. If the function code is strict code, set the ThisBinding to thisArg.
  2. Else if thisArg is null or undefined, set the ThisBinding to the global object.
  3. Else if Type(thisArg) is not Object, set the ThisBinding to ToObject(thisArg).
    ...

取决于 'strict mode';

in strict mode: true (type is number)
without strict mode: false (type is object)

尝试检查该函数的结果:

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

您可以看到结果是 Number {[[PrimitiveValue]]: 1} 所以结果是一个对象而不是原始类型。由于您使用的是三个等号,因此您要求类型相同:

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

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

相信我,这不是 javascript 最奇怪的事情 ;-)

原语1在.call[=中设置为this时被转换为Number对象 23=] 因为 this 在 javascript 中总是一个对象。

[Number: 1]与原始1.[=10=严格(===)不一样]

但是当使用非严格相等运算符 (==) 时,Number 对象 被转换为原始类型以进行比较。

(function(){ return this;}).call(1) returns 类型为 Number 的对象,根据 OFF 开发者控制台:

1是原始类型。