Javascript 为什么是';0';==当';0';==假的

Javascript 为什么是';0';==当';0';==假的,javascript,Javascript,这个问题说明了我的理解!!假=假 那么如果 0 == false // true '0' == false // true 为什么 字符串零('0')是真实值 !!”0'==true !'0' -> !false -> true 那么你真的在做什么 true==true字符串零('0')是真实值 !!”0'==true !'0' -> !false -> true 那么你真的在做什么 true==true看起来您偶然发现了==操作符的重要性 '0' == fal

这个问题说明了我的理解!!假=假

那么如果

0 == false // true 
'0' == false // true 
为什么

字符串零('0')是真实值

!!”0'==true

!'0' -> !false -> true
那么你真的在做什么

true==true

字符串零('0')是真实值

!!”0'==true

!'0' -> !false -> true
那么你真的在做什么


true==true

看起来您偶然发现了
==
操作符的重要性

'0' == false;  // true
'0' === false; // false

Boolean('0');  // true

typeof('0');   // string
typeof(!'0');  // boolean

!'0' === false; // true
!!'0' === false // false

看起来您偶然发现了
==
操作符的重要性

'0' == false;  // true
'0' === false; // false

Boolean('0');  // true

typeof('0');   // string
typeof(!'0');  // boolean

!'0' === false; // true
!!'0' === false // false

第一个否定通过调用抽象函数
ToBoolean
将字符串
'0'
转换为布尔值。根据
JavaScript
,只有7个值被计算/强制/转换为false,即为false:
null
未定义
NaN
,空字符串,
+0
-0
,和
false

所以,
'0'
被评估为真实的,
!'0'
错误
将0'
设置为true

PS:在OP在下面的评论中提出原始问题后,提出了另一种情况,说明为什么
'0'==false
被评估为
true
。尽管与原始帖子无关,但以下是解释:

在规范中,部分内容为:“当计算
x==y
时,如果
y
的类型为
Boolean
,则首先将
y
转换为
数字
,然后再次进行比较”


因此
Number(false)
的计算结果为
0
。在下一次比较运行中,字符串
'0'
与数字
0
进行比较,即
'0'==0
。规范要求将字符串转换为数字,然后再次进行比较:
0==0

第一个否定通过调用抽象函数
ToBoolean
将字符串
'0'
转换为布尔值。根据
JavaScript
,只有7个值被计算/强制/转换为false,即为false:
null
未定义
NaN
,空字符串,
+0
-0
,和
false

所以,
'0'
被评估为真实的,
!'0'
错误
将0'
设置为true

PS:在OP在下面的评论中提出原始问题后,提出了另一种情况,说明为什么
'0'==false
被评估为
true
。尽管与原始帖子无关,但以下是解释:

在规范中,部分内容为:“当计算
x==y
时,如果
y
的类型为
Boolean
,则首先将
y
转换为
数字
,然后再次进行比较”



因此
Number(false)
的计算结果为
0
。在下一次比较运行中,字符串
'0'
与数字
0
进行比较,即
'0'==0
。规范要求将字符串转换为数字并再次进行比较:
0==0

'0'
是非空字符串,因此它是
true
@heyza22它不是
true
,该语句记录了
false
。我的理解可能不正确。当您使用==比较两个不同类型的值时,javascript会将两个操作数转换为同一类型,然后进行严格比较('=='),因此'0'==false应转换为0==0,这是真的。
'0'
本身的计算结果为
true
'0'==false
也是
真的
,因为为了比较它们,
=
会将两者强制转换为相同的类型,在本例中为int。因此
'0'
变为
0
,而
false
也变为
。不过,这个问题是重复的,已经标记为重复。dupe中的答案解释了这一点。
在比较之前应用。这取决于操作顺序
2+3==5
变成
5==5
,而不是
2+false
'0'
是一个非空字符串,所以它是
true
@heyza22它不是
true
,该语句记录
false
。以下是我的理解,可能不正确。当您使用==比较两个不同类型的值时,javascript会将两个操作数转换为同一类型,然后进行严格比较('=='),因此'0'==false应转换为0==0,这是真的。
'0'
本身的计算结果为
true
'0'==false
也是
真的
,因为为了比较它们,
=
会将两者强制转换为相同的类型,在本例中为int。因此
'0'
变为
0
,而
false
也变为
。不过,这个问题是重复的,已经标记为重复。dupe中的答案解释了这一点。
在比较之前应用。这取决于操作顺序
2+3==5
变为
5==5
,而不是
2+false
。我没有否决投票,但控制台中的'0'==false。log('0'==false)给出true。所以它不被视为一个不空的世界string@heyza22当您使用
=
时,它试图将两个值都强制为同一类型,因此当它强制
0
为布尔值时,它是错误的,因此您将
'0'==false
作为true,但为什么相同的逻辑不适用于!!'0'==false,则它给出false@heyza22因为
的优先级高于
=
,因此首先计算它,然后再计算
=
什么是
真的
?我没有否决投票,但控制台中的'0'==false。log('0'==false)给出true。所以它不被视为一个不空的世界string@heyza22当您使用
=
时,它会尝试将两个值强制为同一类型,因此当它强制
0
为布尔值时,它是错误的,因此您将
'0'==false
作为true,但为什么相同的逻辑不适用