gpt4 book ai didi

javascript - 为什么 JavaScript 中的假值彼此不相等?

转载 作者:行者123 更新时间:2023-11-28 11:22:33 26 4
gpt4 key购买 nike

A falsy value is a value that translates to false when evaluated in a Boolean context. https://developer.mozilla.org/en-US/docs/Glossary/Falsy

以下值在 Javascript 中是假值:false0""null未定义NaN

现在我看到了这种奇怪的行为:只有假值 false0"" 彼此相等,但是不等于其他虚假值。

此外,nullundefined 不等于除自身之外的任何虚假值。

最后但并非最不重要的一点是,NaN 不等于任何虚假值,甚至不等于其本身!

然而,在诸如 if (value) { ... } 之类的 bool 表达式中,它们都计算为 false

这种看似不一致的行为有什么好处或用例?

注意:“等于”是指由 == 运算符定义的(宽松的)相等性,而不是由 ===< 定义的严格同一性 运算符。

最佳答案

Why are falsy values not equal to each other in JavaScript?

因为用作 bool 值时强制转换为相同值的两个值之间存在差异,并且这两个值彼此相等。

What's the benefit or use case of this seemingly inconsistent behavior?

我们进入了很大程度上主观的领域,这对于SO来说并不是真正的主题。这么说吧,JavaScript 宽松的平等规则长期以来一直是争论和困惑的主题。人们必须记住,它们是由 Brendan Eich 在 1995 年 5 月那疯狂的 10 天里创建的,他在其中创建了 JavaScript,其中有一些“ clang ”也就不足为奇了。请记住,他的任务是创建一种宽容、宽容的语言,供非程序员使用。因此自动分号转换、松散相等等等。这种语言旨在让您从 input 中获取一个值并将其视为数字,即使 valueinput 始终是一个字符串。这些规则是否实现了这一目标是一个见仁见智的问题(无论如何我都不会在这里提出一个:-))。

大多数“怪异”都是规则的副产品,这些规则大多看起来很合理(再次,有一些错误)。让我们考虑一下 "" == 0 是真的:

== 的规则是 abstract equality comparison algorithm ,它表示如果第一个操作数 ( x ) 是字符串,第二个操作数 ( y ) 是数字,则返回 ToNumber(x) == y 的结果。抛开强制相等运算符是否是一个好主意的问题,如果您打算使用一个,那么这似乎是一种接近 string == number 的合理方法。因此,我们查看 ToNumber 算法,该算法表示 ToNumber(string) 使用 ToNumber Applied to the String Type algorithm 将字符串解释为数字,其中除其他外,它表示空字符串会变为 0

所以问题不是“为什么 "" 等于 0”,而是“为什么 "" 当被视为数字时会强制转换为值 0?”只有艾希可以回答这个问题。 :-)

主要的 ToNumber 算法中还有一些其他有趣的算法,例如 undefined => NaNnull => 0 。同样,只有 Eich 可以解释为什么他认为 null 应该等于 0undefined 等于 NaN

值得注意的是,他可能并不是随意挑选这些东西的。他学习了其他几种语言,并根据这些知识做出了选择。回想起来,其中一些选择可能看起来很奇怪(implicit globals?真的吗?),但是,大多数人有 10 多天的时间来创建一种语言,在这段时间里他们可以寻求同事和社区的意见。再说一次,还有“宽容”的设计标准。

我可能在那里误入了一些主观性。如果是这样,请道歉;我试着不这么做。 :-)

<小时/>

最后一点:如果您发现规则任意且难以记住,那么您并不孤单。处理这个问题的一种方法是确保您显式执行所有类型强制。但请注意,即使您尝试这样做,您也会陷入松散的比较,因为尽管有严格相等运算符( === )和严格不等运算符( !== ),但没有 ><>= 的严格版本,或 <= 。因此,如果您错过了显式强制转换,并且您正在执行任何其他关系,则您的代码可能看起来仍然有效。我不提倡这样做(也不提倡反对它),我见过由显式类型强制和没有显式类型强制引起的错误。只是说这是解决棘手规则的一种方法。

关于javascript - 为什么 JavaScript 中的假值彼此不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31005728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com