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
- If the function code is strict code, set the ThisBinding to thisArg.
- Else if thisArg is null or undefined, set the ThisBinding to the global object.
- 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
是原始类型。
我今天遇到了一个惊喜,我找不到规范的适当部分来确定这是否是预期的。我的钱花在了那个 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
- If the function code is strict code, set the ThisBinding to thisArg.
- Else if thisArg is null or undefined, set the ThisBinding to the global object.
- 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
是原始类型。