Поскольку NaN не равно любому другому значению, в том числе другому NaN, почему алгоритм свободного равенства в спецификации Javascript не проверяет, является ли какой-либо из операндов первым NaN? Если какой-либо из операндов имеет значение NaN, результат ложный, дополнительная обработка не требуется.
В спецификации Javascript приведен алгоритм ==:
Если SameType(x, y) истинно, то
a. Верните IsStrictlyEqual(x, y).
Если x имеет значение NULL, а y не определено, верните true.
Если x не определено, а y имеет значение NULL. , верните true.
ПРИМЕЧАНИЕ. Этот шаг заменен в разделе B.3.6.2.
Если x — число, а y — строка , возвращаться ! IsLooselyEqual(x, ! ToNumber(y)).
Если x — строка, а y — число, верните ! IsLooselyEqual(! ToNumber(x), y).
Если x — это BigInt, а y — строка, то
a. Пусть n равно StringToBigInt(y).
b. Если n не определено, верните false.
c. Возвращаться ! IsLooselyEqual(x, n).
Если x — это строка, а y — BigInt, верните ! IsLooselyEqual(y, x).
Если x — логическое значение, верните ! IsLooselyEqual(! ToNumber(x), y).
Если y — логическое значение, верните ! IsLooselyEqual(x, ! ToNumber(y)).
Если x — это строка, число, BigInt или символ, а y — объект, верните ! IsLooselyEqual(x, ? ToPrimitive(y)).
Если x — объект, а y — строка, число, BigInt или символ, верните ! IsLooselyEqual(? ToPrimitive(x), y).
Если x — это BigInt, а y — число, или если x — число, а y — BigInt, то
а. Если x не конечно или y не конечно, верните false.
b. Если ℝ(x) = ℝ(y), вернуть true; в противном случае верните false.
Верните false.
Согласно этому алгоритму, если x или y равно NaN, шаги 5, 6, 9, 10, 11, 12 будут стоить времени выполнения, и результат должен быть ложным.
Если первый шаг:
1.if x или y — NaN, верните false.
алгоритм может получить и вернуть этот результат немедленно.
Поскольку NaN не равно любому другому значению, в том числе другому NaN, почему алгоритм свободного равенства в спецификации Javascript не проверяет, является ли какой-либо из операндов первым NaN? Если какой-либо из операндов имеет значение NaN, результат ложный, дополнительная обработка не требуется. В спецификации Javascript приведен алгоритм ==: [list] [*]Если SameType(x, y) истинно, то a. Верните IsStrictlyEqual(x, y). [*]Если x имеет значение NULL, а y не определено, верните true. [*]Если x не определено, а y имеет значение NULL. , верните true. [*]ПРИМЕЧАНИЕ. Этот шаг заменен в разделе B.3.6.2. [*]Если x — число, а y — строка , возвращаться ! IsLooselyEqual(x, ! ToNumber(y)). [*]Если x — строка, а y — число, верните ! IsLooselyEqual(! ToNumber(x), y). [*]Если x — это BigInt, а y — строка, то a. Пусть n равно StringToBigInt(y). b. Если n не определено, верните false. c. Возвращаться ! IsLooselyEqual(x, n). [*]Если x — это строка, а y — BigInt, верните ! IsLooselyEqual(y, x). [*]Если x — логическое значение, верните ! IsLooselyEqual(! ToNumber(x), y). [*]Если y — логическое значение, верните ! IsLooselyEqual(x, ! ToNumber(y)). [*]Если x — это строка, число, BigInt или символ, а y — объект, верните ! IsLooselyEqual(x, ? ToPrimitive(y)). [*]Если x — объект, а y — строка, число, BigInt или символ, верните ! IsLooselyEqual(? ToPrimitive(x), y). [*]Если x — это BigInt, а y — число, или если x — число, а y — BigInt, то а. Если x не конечно или y не конечно, верните false. b. Если ℝ(x) = ℝ(y), вернуть true; в противном случае верните false. [*]Верните false. [/list] Согласно этому алгоритму, если x или y равно NaN, шаги 5, 6, 9, 10, 11, 12 будут стоить времени выполнения, и результат должен быть ложным. Если первый шаг: 1.if x или y — NaN, верните false. алгоритм может получить и вернуть этот результат немедленно.