为什么 undefined == undefined 是 true 而不是 undefined <= undefined?
Why is undefined == undefined true but not undefined <= undefined?
在 JavaScript 中,这是正确的:
undefined == undefined
但这是错误的:
undefined <= undefined
起初我以为 <=
运算符包含第一个,但我猜它试图将其转换为数字但失败了,但我没有找到任何文档来支持这一点.
<=
运算符 coerces both operands into actual Numbers before performing the comparison if both operands are primitives -- while ==
does not.1 Abstract relational comparison is performed which is where this conversion actually happens. The operation ToNumber 对 undefined
执行,产生 NaN
(请参阅 linked table)。如果您随后查看抽象关系比较的步骤 4c 和 4d,如果 <=
的任一操作数被强制转换为 NaN
,则从抽象关系比较返回 undefined
。回到第一个 link,您将在第 7 步中看到:
If r is true or undefined, return false. Otherwise, return true.
由于抽象关系比较返回 undefined
,<=
的计算结果为 false。
不太正式,你可以这样看你的比较:
const first = Number(undefined); //or +undefined
const two = Number(undefined); //this is NaN
NaN <= NaN
因为 NaN == NaN
is never true, nor is NaN < NaN
,NaN <= NaN
是错误的。
1 undefined == undefined
returns true 基于抽象 SameValueNonNumber 操作,如果两个操作数是相同的值,则与相等运算符一起使用,但不是数字。
阅读 JavaScript 中的 强制。关于您的问题,当您应用相等运算符时,您的未定义被强制转换为布尔值。所以你得到了一个真实的结果。当您应用“<=”运算符时,您的 undefined 被强制转换为一个 Number 并且您得到一个 NaN 值,这就是错误结果的原因。
在 JavaScript 中,这是正确的:
undefined == undefined
但这是错误的:
undefined <= undefined
起初我以为 <=
运算符包含第一个,但我猜它试图将其转换为数字但失败了,但我没有找到任何文档来支持这一点.
<=
运算符 coerces both operands into actual Numbers before performing the comparison if both operands are primitives -- while ==
does not.1 Abstract relational comparison is performed which is where this conversion actually happens. The operation ToNumber 对 undefined
执行,产生 NaN
(请参阅 linked table)。如果您随后查看抽象关系比较的步骤 4c 和 4d,如果 <=
的任一操作数被强制转换为 NaN
,则从抽象关系比较返回 undefined
。回到第一个 link,您将在第 7 步中看到:
If r is true or undefined, return false. Otherwise, return true.
由于抽象关系比较返回 undefined
,<=
的计算结果为 false。
不太正式,你可以这样看你的比较:
const first = Number(undefined); //or +undefined
const two = Number(undefined); //this is NaN
NaN <= NaN
因为 NaN == NaN
is never true, nor is NaN < NaN
,NaN <= NaN
是错误的。
1 undefined == undefined
returns true 基于抽象 SameValueNonNumber 操作,如果两个操作数是相同的值,则与相等运算符一起使用,但不是数字。
阅读 JavaScript 中的 强制。关于您的问题,当您应用相等运算符时,您的未定义被强制转换为布尔值。所以你得到了一个真实的结果。当您应用“<=”运算符时,您的 undefined 被强制转换为一个 Number 并且您得到一个 NaN 值,这就是错误结果的原因。