- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 中是假值:false
、0
、""
、null
、未定义
和NaN
。
现在我看到了这种奇怪的行为:只有假值 false
、0
和 ""
彼此相等,但是不等于其他虚假值。
此外,null
和 undefined
不等于除自身之外的任何虚假值。
最后但并非最不重要的一点是,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
中获取一个值并将其视为数字,即使 value
的 input
始终是一个字符串。这些规则是否实现了这一目标是一个见仁见智的问题(无论如何我都不会在这里提出一个:-))。
大多数“怪异”都是规则的副产品,这些规则大多看起来很合理(再次,有一些错误)。让我们考虑一下 "" == 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
=> NaN
但 null
=> 0
。同样,只有 Eich 可以解释为什么他认为 null
应该等于 0
但 undefined
等于 NaN
。
值得注意的是,他可能并不是随意挑选这些东西的。他学习了其他几种语言,并根据这些知识做出了选择。回想起来,其中一些选择可能看起来很奇怪(implicit globals?真的吗?),但是,大多数人有 10 多天的时间来创建一种语言,在这段时间里他们可以寻求同事和社区的意见。再说一次,还有“宽容”的设计标准。
我可能在那里误入了一些主观性。如果是这样,请道歉;我试着不这么做。 :-)
<小时/>最后一点:如果您发现规则任意且难以记住,那么您并不孤单。处理这个问题的一种方法是确保您显式执行所有类型强制。但请注意,即使您尝试这样做,您也会陷入松散的比较,因为尽管有严格相等运算符( ===
)和严格不等运算符( !==
),但没有 >
、 <
、 >=
的严格版本,或 <=
。因此,如果您错过了显式强制转换,并且您正在执行任何其他关系,则您的代码可能看起来仍然有效。我不提倡这样做(也不提倡反对它),我见过由显式类型强制和没有显式类型强制引起的错误。只是说这是解决棘手规则的一种方法。
关于javascript - 为什么 JavaScript 中的假值彼此不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31005728/
也许我在 Java 上工作的时间太长而没有真正理解它的一些基础知识。 我确实理解 == 用于对象引用相等,而 .equals() 用于对象值相等。 比较整数: Integer x = 1, y = 1
我是从一道考试题中得出这个答案的,但无法理解该解决方案的工作原理。如果值“x”和“y”相等,则此函数应该返回“true”,否则返回 False。 解决方法: function equal_boolea
我将带有表情符号的文本存储在 mysql 数据库中。 数据库、表和列设置为使用utf8mb4和utf8mb4_unicode_ci。 我可以毫无问题地输入单元格值(数据类型是 VARCHAR)。 但是
如果两个 DateTime 对象具有相同的日、月和年,我该如何比较?问题是他们有不同的小时/分钟/秒。 最佳答案 对于 DateTime 对象,没有好的方法可以做到这一点。所以你必须做,比方说,不是那
我一直想知道这个问题,所以我想我会问的。 您将看到的大多数地方都使用相同的语义逻辑来覆盖 Equals 和 GetHashCode 以实现成员平等...但是它们通常使用不同的实现: publi
苹果 CoreGraphics.framework , CGGeometry.h : CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize s
在最新的python 版本中, dict 保留了插入的顺序。在平等方面是否有任何变化。例如,目前以下工作。既然广告顺序很重要, future 会不会发生这种变化? 我问是因为有根本性的变化 - 以前
class VideoUserModel(models.Model): user = models.ManyToManyField(get_user_model()) viewlist
我在 COQ 中有一个有限枚举类型(比如 T),我想检查元素是否相等。这意味着,我需要一个函数 bool beq_T(x:T,y:T) 我设法定义这样一个函数的唯一方法是逐个分析。这会导致很多匹配语
我在 Windows 7(32 位)下的 MinGW 中使用 gfortran 来编译 Fortran 代码。这是文件 testequal.f 中包含的最少代码: program test
我有以下 jsp 片段: ${campaign.moderated}
我想检查两个稀疏数组是否(几乎)相等。而对于 numpy 数组,你可以这样做: import numpy as np a = np.ones(200) np.testing.assert_array_
我有以下类(class): public class MyDocuments { public DateTime registeredDate; public
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 5 年前。 我在这里想做的是,我采用一个精度值(小于 1)并打印 1/n 类型的所有数字
我正在为我的arduino写一个草图,我想检查我的字符串的最后一个字符。 例如: 如果输入是 cats- 我想看看最后一个字符(在我的例子中是“-”)实际上是否 - 我使用的代码: 串行事件函数 vo
让我们开始: using System; public class Program { class A { public virtual void Do() { }
我只需要根据几个键(不是全部)来确定两个 HashMap 的相等性 除了单独访问每个字段并比较相等性之外,还有其他节省时间的方法吗? 最佳答案 我能想到的一种方法是在您的 HashMap 上存储某种“
在Java中,大写的Double可以为null。 但是如果我有 double a 和 b 并且我这样做: if (a.equals(b)) 如果其中之一为空,它会崩溃。有没有更好的方法来比较它们? 最
我正在尝试从我的旧数据库中插入表格数据。 Id 在数据库表和选择特定列中都相等。这是我的数据库。 旧数据库:sch -> 旧表:product (id, tag, url) (13, red, aaa
我正在开发一个应用程序,它在我的主视图中有一个侧边栏和两个 div。我试图在容器内平均分割两者的高度。我试过 height = 50% 但效果不太好。
我是一名优秀的程序员,十分优秀!