在JavaScript中检查string相等的正确方法是什么?
什么是正确的方法来检查JavaScript之间的string平等?
总是在您完全理解使用==
和===
运算符的区别和含义之前,请使用===
运算符,因为它可以帮助您避免模糊(不明显)的错误和WTF。 由于内部的types强制,“regular” ==
运算符可能会有非常意想不到的结果,所以使用===
始终是推荐的方法。
为了深入了解这个,以及Javascript的其他“好与坏”部分,请阅读Douglas Crockford先生和他的工作。 有一个伟大的谷歌技术讲座,他总结了很多很好的信息: http : //www.youtube.com/watch?v=hQVTIJBZook
更新:
你不知道凯尔辛普森的JS系列是优秀的(并可以在线阅读)。 该系列进入了常见的语言误解领域,并解释了克罗克福德build议你避免的“坏部分”。 通过了解他们,你可以正确使用他们,避免陷阱。
“ Up&Going ”一书包含了一个关于Equality的部分,以及关于何时使用loose( ==
)vs strict( ===
)运算符的具体概述:
为了简化一些细节,并在各种情况下帮助你了解是否使用
==
或===
,下面是我的简单规则:
- 如果比较中的任何一个值(aka side)可以是
true
或false
值,则避免==
并使用===
。- 如果比较中的任一值可能是这些特定值(
0
,""
或[]
– 空数组),请避免==
并使用===
。- 在所有其他情况下,您可以安全地使用
==
。 这不仅是安全的,而且在很多情况下它可以简化代码,提高可读性。
对于那些不想投入时间去真正理解Javascript的开发者,我仍然build议Crockford的发言 – 对于偶尔使用Javascript的开发者来说,这是一个很好的build议。
如果你知道他们是string,那么没有必要检查types。
"a" == "b"
但是,请注意,string对象不会相同。
new String("a") == new String("a")
将返回false。
调用valueOf()方法将其转换为String对象的基元,
new String("a").valueOf() == new String("a").valueOf()
将返回true
只有一个答案:如果所有这些方法返回false,即使这些string看起来是平等的,可能有一个string的左侧或右侧有一个空格。 因此,在比较之前,只需在string末尾添加一个.trim()
:
if(s1.trim() === s2.trim()) {...}
试图弄清楚什么是错误,我已经失去了数小时。 希望这会有助于某人!
除非你真的知道强制如何工作,否则你应该避免==
并使用身份运算符===
。 但是你应该阅读这个来理解它是如何工作的 。
如果你使用==
,你让语言为你做一些types的强制,例如:
"1" == 1 // true "0" == false // true [] == false // true
正如道格拉斯·克罗克福德(Douglas Crockford)在他的书中所说
最好使用身份运算符。
是什么导致我这个问题是padding
和white-spaces
检查我的情况
if (title === "this word") doSomething();
和标题是" this word"
所以也许你必须使用像这样的
trim
function
var title = $(this).text().trim();
实际上有两种方法可以在javascript中创buildstring。
-
var str = 'Javascript';
这会创build一个原始string值。 -
var obj = new String('Javascript');
这将创build一个String
types的包装器对象。typeof str // string
typeof obj // object
因此,检查相等性的最好方法是使用===
运算符,因为它检查值以及两个操作数的types。
如果你想检查两个对象之间的相等性,那么使用String.prototype.valueOf
是正确的方法。
new String('javascript').valueOf() == new String('javascript').valueOf()
我已经提供了一些代码 (与下面相同)来解释与示例的JavaScripttypes转换相等比较。
<!-- JavaScript has both strict and type-converting equality comparison. For strict equality the objects being compared must have the same type, presented by === (the triple equal sign). For strict equality, the objects being compared must be equal in type as well. Below I am going to provide you couple examples, I hope they help you! Please, don't forget to like my code. Thank you! --> <!DOCTYPE html> <html> <body> <p id="demo"></p> <script> document.write("The == and === comparison" + "<br>" + "<br>"); //document.write(" (0 == false) returns: " + (0 == false) + "<br>"); // true document.write((0 == false) + "<br>"); // true document.write((0 === false) + "<br>"); // false, because they are of a different type document.write((1 == "1" ) + "<br>"); // true, automatic type conversion for value only document.write((1 === "1" ) + "<br>"); // false, because they are of a different type document.write(('0' == false) + "<br>"); // true document.write(('0' === false) + "<br>"); // false document.write((2==='2') + "<br>"); //false document.write((2==="2") + "<br>"); //false document.write(("2"===2) + "<br>"); //true document.write((2===2) + "<br>"); //true document.write(("3"==3) + "<br>"); //true document.write((3=='3') + "<br>"); //true document.write((3==true) + "<br>"); //false /*Two numbers are strictly equal when they are numerically equal (have the same number value). */ document.write((3==3) + "<br>"); //true document.write((5.2==5.2) + "<br>"); //true /* Two strings are strictly equal when they have the same sequence of characters, same length, and same characters in corresponding positions. */ document.write(("hola"=="hola") + "<br>"); //true document.write(("hola"=="Hola") + "<br>"); //false, because they differ in a character 'H' /* NaN is not equal to anything, including NaN. Positive and negative zeros are equal to one another. */ document.write(("NaN"=="hola") + "<br>"); //false document.write(("NaN"== -3) + "<br>"); //false document.write(("NaN"== 3) + "<br>"); //false document.write(("NaN"== 2.5) + "<br>"); //false /* Two Boolean operands are strictly equal if both are true or both are false. */ document.write(((0 > 5) == (8 < 9 )) + "<br>"); // false, the first condition (0>5) returns false and (8<9) returns true document.write(((8 >= 5) == (8 == 9 )) + "<br>"); // false, the first condition (8>=5) returns true and (8==9) returns false document.write(((true) == (true)) + "<br>"); // true document.write(((false) == (false)) + "<br>"); // true /* Null and Undefined types are == (but not ===). [eg: (Null==Undefined) is true but (Null===Undefined) is false] */ document.write((null == undefined) + "<br>"); // true document.write((null === undefined) + "<br>"); // false /* Two objects are strictly equal if they refer to the same Object. */ var car1 = {type:"Fiat", model:"500", color:"white"}; var car2 = {type:"Fiat", model:"500", color:"white"}; var x = car1; document.write((car1 === car2)+ "<br> "); // false document.write((car1 == car2)+ "<br> "); // false document.write((car1 === x)+ "<br> "); // true document.write((car1 == x)+ "<br>"); // true /* DO NOT FORGET THAT = (a single equal sign) represents assignment. eg: var X = 3; Here we were assigning 3 to variable X */ </script> </body> </html>