gpt4 book ai didi

javascript - 为什么在 ECMAscript 中函数 <= 函数为真,但 NaN <= NaN 为假

转载 作者:行者123 更新时间:2023-12-01 15:35:32 24 4
gpt4 key购买 nike

我试图理解比较函数的奥秘:

let a=function(){}
let b=function(){}
console.log(a==b) //false
console.log(a===b) //false
console.log(a<b) //false
console.log(a>b) //false
console.log(a<=b) //true !?!
console.log(a>=b) //true !?!

console.log( (+a) < (+b) ) //false
console.log( (+a) > (+b) ) //false
console.log( (+a) <= (+b) ) //false
console.log( (+a) >= (+b) ) //false

在 ECMAscript 中,<= 运算符是 described :

RelationalExpression:RelationalExpression<=ShiftExpression

  1. Let lref be the result of evaluating RelationalExpression.
  2. Let lval be ? GetValue(lref).
  3. Let rref be the result of evaluating ShiftExpression.
  4. Let rval be ? GetValue(rref).
  5. Let r be the result of performing Abstract Relational Comparison rval < lval with LeftFirst equal to false.
  6. ReturnIfAbrupt(r).
  7. If r is true or undefined, return false. Otherwise, return true.

抽象关系比较似乎对字符串和 BigInts 有特殊情况,但我认为其他所有内容都应该转换为数字。所以我希望第二组比较等同于第一组,但事实并非如此。我错过了什么?

最佳答案

抽象关系比较调用 ToPrimitive在带有 'number' 提示的参数上.然后调用 OrdinaryToPrimitive再次提示 'number' .
这里的提示实际上只是一个提示;不需要例程返回该类型。 'number'的提示只是导致 OrdinaryToPrimitive 尝试调用 valueOf之前 toString ,但它最终仍会调用 toString如果 valueOf不返回原语。
如果您提供返回原语的 valueOf 实现,它将用于比较:

let a=function(){}
let b=function(){}

a.valueOf = () => 1;
b.valueOf = () => 0;

console.log( a <= b );
console.log( b <= a );

默认情况下,函数的 valueOf 返回函数本身,它不是原始函数,因此改为调用 toString 并将函数作为字符串进行比较。

关于javascript - 为什么在 ECMAscript 中函数 <= 函数为真,但 NaN <= NaN 为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63180680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com