为什么JavaScript将0视为空字符串?

32
执行以下javascript代码,我得到0等于''(一个空字符串)。
可能重复:暗示字符串比较,0 ='',但1 ='1'
var a   =   0;
var b   =   '';//empty string
if(a==b){
    console.log('equal');//this is printed in console
}else{
    console.log('not equal');
}

有人可以指导一下这背后的原因吗?


(typeof a == typeof b && a == b) 用于检查它们是否相同 (a === b) 用于检查a和b是否指向内存中的同一对象 - DevWL
使用代码 if(a===b) 返回正确结果。 - Đọc truyện hay
9个回答

51
引用文档(MDN):

相等 (==)

如果两个操作数类型不同,JavaScript会将它们转换后再进行严格比较。如果任一一个操作数是数字或布尔值,则在可能的情况下将操作数转换为数字;否则,如果任意一个操作数是字符串,则将另一个操作数转换为字符串。

在这里, 因为 a 操作数的类型是 Number,所以 b 也被转换成了数字。而 Number('') 的结果为 0

这有时可能会令人感到惊讶。例如,请考虑以下情况:

console.log(0 == '0');  // true
console.log(0 == '');   // true
console.log('' == '0'); // O'RLY?

...或者是这个:

console.log(false == undefined); // false
console.log(false == null);      // false
console.log(null == undefined);  // fal.... NO WAIT!

这就是为什么几乎总是建议使用 === (严格相等)运算符的原因。


感谢分享详细信息。类型比较肯定应该是首选。但在我们的情况下,我们遇到了一个挑战,即此比较发生在接收值作为参数的函数中,用户也可以传递1作为'1',这在javscript中是允许的。在这种情况下,如果我们使用类型比较,则'1'将不等于1。因此,我们必须避免类型比较。不知道什么方法最安全? - netemp
1
@netemp 我建议使用 parseInt(arg, 10) 结构。当 arg 是一个字符串时,它将被 解析 成数字(这比 Number(arg) 更一致),而当 arg 是一个数字时,它将原封不动地返回给你。 - raina77ow
谢谢。我不知道类型转换是使用Number实现的(与parseInt不同,它在''或' '的情况下不返回NaN)。答案还帮助我解释了为什么:'' == 0 && ' ' == 0 // true。但是:!!' ' == !!0 // false。对于后者,首先对每个参数进行类型转换(而不是==两侧的参数),因此' '计算为真值。 - Moika Turns

5

0, ""(空字符串)和 false 在类型转换后的值是相同的。如果你需要严格区分它们,可以使用 === 运算符。

在类似 PHP 的编程语言中也是如此。

var a = 0;
var b = ''; //empty string
if(a == b){
    console.log('equal'); //this is printed in console
}else{
    console.log('not equal');
}

进行严格比较:

if(a === b){
    console.log('equal');
}else{
    console.log('not equal'); //this is printed in console
}

1
“这在任何编程语言中都是一样的。”并非如此。顺便说一下,我不是投票者。 - Leri
1
“0 null "" are all same”是一个有趣的说法。同样,“这也适用于任何编程语言”。话虽如此,我认为你的答案是正确的,但不准确。 - Michael Krelin - hacker
1
好的,我已经更新了答案。 - Praveen Kumar Purushothaman
@AlexK。已更正。:) 应该是 false 而不是 null。谢谢。 - Praveen Kumar Purushothaman
1
我(如果上次没有表达清楚,我是那个给你点踩的人)已经取消了踩的操作。不过,你应该更具体地说明你将其转换为什么类型,并且我认为说某些东西类似于PHP可能会冒犯到一些人 :) - Michael Krelin - hacker
显示剩余4条评论

2
在JavaScript中,==运算符不会比较类型,所以0=='' === true(因为作为数字字符串的''会被计算为0),或者0==false === true(因为布尔值false会被计算为0)。如果要比较类型,可以使用===运算符。点击这里获取有关比较的有用信息。

1

== 进行类型转换。始终使用 ===。

在您的示例中,b 的空字符串被转换为 0。因此,a 和 b 是相同的。


1

因为空字符串表示为数字是零。如果你比较苹果和橙子,你应该想象一下如果你的特定橙子变成了苹果会是什么样子。


1

因为 == 检查值的相等性,所以 false0 和空字符串是相等的。请使用恒等检查 ===


0

Javascript会自动将不同类型的变量进行比较。这是非严格类型语言中常见的特性。

如果您需要比较变量并检查其类型,请使用===运算符。


0
在大多数编程语言(包括JavaScript)中,""(字符串)、0(整数)、\x0(null)松散地表示相同的意思:“空”。发生的情况是你的JavaScript引擎发现"" == 0为false,由于==,它将0转换为整数。再次是false,所以它将0转换为null,这是false,然后它将0转换为空字符串。(不确定这是否是正确的转换顺序)。为了使条件“精确”匹配(无转换),请使用===代替==

0
由于强制性原因,在JavaScript中进行比较通常最好使用===

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接