首页 > 解决方案 > 在什么情况下 'a != a' 在 JavaScript 中解析为 true?

问题描述

查看 svelte.js 的代码,我发现了这个看起来很奇怪的函数:

function not_equal(a, b) {
    return a != a ? b == b : a !== b;
}

有人可以向我解释在什么情况下将变量与其自身的不平等进行比较会解析为假?

我知道!=并且是比and==更弱的比较运算符,因为它们并不真正关心类型,但我仍然无法弄清楚是什么让函数与简单的函数不同!=====not_equala !== b

标签: javascriptif-statementconditional-statements

解决方案


有几种方法:

1. If ais NaN:NaN不等于任何东西,包括它自己。

let a = NaN;
console.log(a != a); // true

我认为这是条件运算符 in 的可能原因not_equal,因为该函数not_equal(NaN, NaN)false(例如,它认为 NaN 等于自身)。不过,我不清楚他们为什么选择in==而不是===in b == b

2. (这不适用于您的函数,只是a != a问题。) ifa是具有 getter 函数的属性,当连续调用两次时返回不同的值(因为它返回随机值或随时间变化的值, 或 getter 改变值等)在with语句中使用(非常不可能),或者使用 Proxy 而不是with.

const obj = {
    get a() {
        return Math.random();
    }
};
with (obj) {
    console.log(a != a); // PROBABLY true
}

注意:有很好的理由不使用with,并且不能在严格模式下使用。)

除此之外,我想不出a != a办法true


推荐阅读