javascript中是否存在与0相关的特殊相等条件?
我有两个代码示例,我不明白为什么它们会以这种方式进行计算 示例一(这些评估结果为真): 但这将计算为NaN,而不是0:javascript中是否存在与0相关的特殊相等条件?,javascript,equality,Javascript,Equality,我有两个代码示例,我不明白为什么它们会以这种方式进行计算 示例一(这些评估结果为真): 但这将计算为NaN,而不是0: ({} + []) / ({} + 1) 示例2(您可以链接第一个): 但这将评估为false,即使选择任意两个将评估为true 0 == "0" == 0/1 0 == "0" == 0/1 使用==运算符时,允许强制。这使得值要么是“truthy”,要么是“falsy”,这取决于所涉及的操作数。用===运算符试试看会发生什么。您得到了第一个示例的解释
({} + []) / ({} + 1)
示例2(您可以链接第一个): 但这将评估为false,即使选择任意两个将评估为true
0 == "0" == 0/1
0 == "0" == 0/1
使用==运算符时,允许强制。这使得值要么是“truthy”,要么是“falsy”,这取决于所涉及的操作数。用===运算符试试看会发生什么。您得到了第一个示例的解释,下面是第二个示例:
1 == "1" == 1/1 -> true
解释:1==“1”->true
,然后true==1/1
计算为1==1
,即true
0 == "0" == 0/1
解释:0==“0”->true
,然后true==0/1
计算为1==0
,即false
这就是为什么我的示例0==1==0
在注释中的计算结果为true
0==1->false
,false==0->true
0 == "0" == 0/1
示例一(这些评估结果为真):
请理解您的表达和以下内容:
({} + []) == 0
({} + 1) == 1
考虑到括号中的表达式的计算结果分别为“[object object]”
(和“[object object]1”
),很明显,为什么除法会产生NaN
样本二是另一回事 javascript中是否存在与0相关的特殊相等条件 对
0
是唯一的falsy数字,在使用布尔值时会产生不同(其中false
将转换为0
)
检查此项的评估:
(1 == "1") == 1/1 // casting the string to a number
(1 == 1) == 1
true == 1 // casting the boolean to a number
1 == 1
true
由于1/1
是1
且等式是可交换的,因此1==(“1”==1/1)
但这将评估为false,即使选择任意两个将评估为true
0 == "0" == 0/1
0 == "0" == 0/1
没有“但是”:
同样,我们是做(0==“0)==0
还是做0==“0”==0
即使没有类型转换,在纯布尔逻辑中也很清楚
(true == true) == true
结果将不同于
(false == false) == false
JavaScript不支持链式比较运算符,这些操作将隐式嵌套。如果需要测试三个值是否相等,请执行
(false==false)&(false==false)
相关操作请使用“==”而不是“==”尝试第一个集,然后读取差异。另一个用于练习:0==1==0
{}+[]
被解释为+[]
。{}
是一个“块”,而不是一个对象。[]
首先转换为一个字符串('
),然后转换为一个数字(0
)。它不是做加法,而是一元+
运算符。与{}+1
相同。{
是括号,就像在({}+[])
中一样,然后它被视为一个对象,变成字符串连接('[object object]'++'
)。请尝试0=={}+[]
和1=={}+1
相反,当我在我的评论中按enter键时,我看到您的答案突然出现:P很好。对示例1使用==
实际上不会有什么区别。这可能是真的,但我试图弄清楚为什么有人会将空对象或空数组与1进行比较。即使是在松散类型的语言中,程序员也必须显示一些规则——事实上,我要说的是,特别是在一种松散类型的语言中。
(true == true) == true
(false == false) == false