javascript - 在什么情况下 'a != a' 在 JavaScript 中解析为 true?
问题描述
查看 svelte.js 的代码,我发现了这个看起来很奇怪的函数:
function not_equal(a, b) {
return a != a ? b == b : a !== b;
}
有人可以向我解释在什么情况下将变量与其自身的不平等进行比较会解析为假?
我知道!=
并且是比and==
更弱的比较运算符,因为它们并不真正关心类型,但我仍然无法弄清楚是什么让函数与简单的函数不同!==
===
not_equal
a !== b
解决方案
有几种方法:
1. If a
is 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
。
推荐阅读
- uml - 一个气泡(用例)代表一个活动图是真的吗?
- flutter - 在 Play 商店发布应用程序后出现空白灰屏
- php - 在页面中显示来自同一类别的 Woocommerce 产品下拉列表
- javascript - 如何在 Javascript/Typescript 中实现负滚动?
- azure - 从 azure text 到语音流到不和谐的音频流
- spring-boot - 如何为返回 Thymeleaf 模板的控制器方法设置特定语言?
- regex - 在正则表达式中捕获特定范围的逗号分隔字符串
- r - 如何在 R 中绘制布朗运动(布莱克斯科尔斯模拟)
- javascript - 如何以角度将缓冲区数据转换为base64图像
- suitecrm - 自定义套件 CRM 字段