查看svelte.js的代码,我发现了这个奇怪的函数:
function not_equal(a, b) {
return a != a ? b == b : a !== b;
}
有人能向我解释在什么情况下比较一个变量与它自己的不平等将解决假?
我知道!=
和==
是比!==
和===
更弱的比较运算符,因为它们并不真正关心类型,但我仍然不明白是什么使not_equal
函数与简单的a !== b
不同
有两种方法:
1。如果a
是NaN
:NaN
不等于任何东西,包括它自己。
let a = NaN;
console.log(a != a); // true
我认为这可能是not_equal
中条件运算符的原因,因为该函数not_equal(NaN, NaN)
是false
(例如,它认为NaN等于它自己)。我不清楚为什么他们在b == b
中使用==
而不是===
。
2。(这不适用于你的函数,只是a != a
的问题)如果a
是一个getter函数的属性,当连续调用两次时返回不同的值(因为它返回随机值,或者随时间变化的值,或者getter改变值等)在with
语句中使用(非常不可能),或者类似地使用代理而不是with
。
const obj = {
get a() {
return Math.random();
}
};
with (obj) {
console.log(a != a); // PROBABLY true
}
(注意:有很好的理由不使用with
,它不能在严格模式下使用。)
除此之外,我想不出a != a
怎么能变成true
。