What's wrong with != '' in javascript (comparing to an empty string)?
jsbin开始警告我EDOCX1[0]不好,我应该换成EDOCX1[1]
为什么?
- 哇,看看所有相关的问题。很多题为"这个javascript代码有什么问题"的问题。
- 如果你费心去查!=和!==之间的差别,那么几秒钟后你就会得到答案。我对一个已经在这里呆了三年的127K用户的期望更高。
- 闭门人-不要基于用户关闭问题。这个问题是有效的。
- 在ECMAScript中检查空字符串时,为什么要使用string.length==0而不是string=="0"的可能重复项?,隐含的字符串比较,0='',但1='1',javascript==vs==:我使用哪个"相等"运算符重要吗?,javascript比较运算符!= VS!=&91;关闭&93;
- 我同意@oded-如果你找不到真正的副本(肯定有副本吗?),这个问题完全正确。
- @我不这么认为,那是关于使用length,而不是!=和!==。
- @T.J.克劳德:第一个问题是为什么,这和这个问题是一样的。在任何情况下,其他的都是关于严格和类型转换相等的。
- @outis:感谢您找到真正的副本(stackoverflow.com/questions/359494/…)。
- @奥德:不做研究的问题将被解决,更不用说50万个副本了。我不想花时间去寻找一个特定的closevote,但这并不能改变这是明显的重复,任何一个在栈溢出数月的人都知道这一点!:)
1 2 3
| var x = false;
console.log(x !== ''); //true
console.log(x != ''); //false |
换句话说,false和其他错误的值(如0)将强制为空字符串。!==和===运算符(严格相等运算符)确保所比较的内容是相同的类型。
为了进一步说明为什么会出现这种情况,您需要遵循规范(在注释中由T.J.Crowder链接)。"抽象相等比较算法"一节告诉我们:
If Type(x) is Boolean, return the result of the comparison ToNumber(x)
== y.
关于ToNumber的章节告诉我们:
The result is 1 if the argument is true. The result is +0 if the
argument is false.
在上面的例子中,参数是false,所以我们现在比较+0 != ''。将数字与字符串进行比较时,遵循以下规则:
If Type(x) is Number and Type(y) is String, return the result of the
comparison x == ToNumber(y).
在空字符串上调用ToNumber会导致+0,就像对false的调用一样:
A StringNumericLiteral that is empty or contains only white space is
converted to +0.
现在我们比较+0 != +0,所以我们进入"x和y属于同一类型"部分,它告诉我们:
If x is the same Number value as y, return true.
所以+0等于+0,因为我们使用!=,所以返回false。
- @Ripper234:所以你需要知道每个人都做了什么(我建议你仔细阅读-严格的平等松散的平等),然后决定在任何给定的情况下使用哪个。两者都有各自的用途,尽管人们通常倾向于严格的用途(===和!==)。