检查JavaScript中字符串之间是否相等的正确方法是什么?
总是在你完全理解使用==和===运算符的区别和含义之前,使用===运算符,因为它将使你免于模糊(不明显)的错误和WTF。由于内部的类型强制,“常规”==运算符可能会产生非常意想不到的结果,因此使用===始终是推荐的方法。
==
===
为了深入了解这一点,以及Javascript的其他“好与坏”部分,请阅读Douglas Crockford先生及其工作。有一个很棒的Google Tech Talk,他总结了很多好的信息:http://www.youtube.com/watch?v=hQVTIJBZook
更新时间:
凯尔·辛普森(Kyle Simpson)的你不知道JS系列非常棒(并且可以在线免费阅读)。该系列深入到语言中常见的误解领域,并解释了克罗克福德建议你避免的“不好的部分”。通过理解它们,你可以正确地使用它们并避免陷阱。
“向上&向前”这本书包括一个关于平等的部分,其中包含何时使用松散(==)与严格(===)运算符的具体摘要:
为了将大量细节归结为一些简单的要点,并帮助您知道在各种情况下是使用==还是===,以下是我的简单规则: 如果比较中的任一值(又名边)可能是true或false值,请避免==并使用===。如果比较中的任何一个值都可能是这些特定值(0、""或[]--空数组),请避免==并使用===。在其他情况下,使用==是安全的。它不仅安全,而且在许多情况下,它以提高易读性的方式简化了您的代码。
为了将大量细节归结为一些简单的要点,并帮助您知道在各种情况下是使用==还是===,以下是我的简单规则:
true
false
0
""
[]
我仍然推荐Crockford的演讲给那些不想花时间去真正理解Javascript的开发人员——对于偶尔使用Javascript的开发人员来说,这是一个很好的建议。
如果您知道它们是字符串,则无需检查类型。
"a" == "b"
但是,请注意字符串对象不会相等。
new String("a") == new String("a")
将返回false。
调用value eOf()方法将其转换为String对象的原语,
new String("a").valueOf() == new String("a").valueOf()
将返回true
实际上有两种方法可以在javascript中制作字符串。
var str = 'Javascript';这将创建一个原始字符串值。
var str = 'Javascript';
var obj = new String('Javascript');这将创建一个包装对象类型String。
var obj = new String('Javascript');
String
typeof str // stringtypeof obj // object
typeof str // string
typeof obj // object
因此,检查相等性的最佳方法是使用===运算符,因为它检查两个操作数的值和类型。
如果你想检查两个对象之间是否相等,那么使用String.prototype.valueOf是正确的方法。
String.prototype.valueOf
new String('javascript').valueOf() == new String('javascript').valueOf()
导致我这个问题的是padding和white-spaces
padding
white-spaces
检查我的案子
if (title === "LastName")doSomething();
标题" LastName"
" LastName"
所以也许你必须像这样使用trim函数
trim
var title = $(this).text().trim();
只有一个答案:如果所有这些方法都返回false,即使字符串看起来相等,也有可能在一个字符串的左侧和右侧有空格。所以,在比较之前,只需在字符串末尾放一个.trim():
.trim()
if(s1.trim() === s2.trim()){// your code}
我花了几个小时试图找出什么是错的。希望对大家有所帮助!
字符串Objects可以使用JSON.stringify()技巧检查。
Objects
JSON.stringify()
var me = new String("me");var you = new String("me");var isEquel = JSON.stringify(me) === JSON.stringify(you);console.log(isEquel);
考虑到两个字符串都可能非常大,有两种主要方法bitwise search和localeCompare
bitwise search
localeCompare
我推荐了这个功能
function compareLargeStrings(a,b){if (a.length !== b.length) {return false;}return a.localeCompare(b) === 0;}
您可以使用==或===,但最后一个以更简单的方式工作(src)
a==b(及其否定!=)
a==b(及其否定!==)
要做简单的比较,请使用#0检查严格相等。正如其他人所说,这具有最高效和减少错误或不确定代码的机会的优点。来源:MDN Web Docs:严格平等。
var a = "hello1";var b = "hello2";console.log("a === a?" + (a === a) + "|");console.log("a === b?" + (a === b) + "|");
如果您想比较两个字符串以了解一个字符串是在另一个字符串之前还是之后,基于自然排序,请使用<、>、<=和>=运算符。来源:#0、#1、>0和>1的MDN WebDocs。
<
>
<=
>=
var a = "hello1";var b = "hello2";console.log("a < a?" + (a < a) + "|");console.log("a < b?" + (a < b) + "|");console.log("a > b?" + (a > b) + "|");console.log("b > a?" + (b > a) + "|");
也考虑到["foo", "bar"] == "foo,bar"。
["foo", "bar"] == "foo,bar"
对于字符串,我们有一个受支持的方法localCompare,它在字符串比较中非常方便。IMO,我们应该只使用它,不需要使事情复杂化。
localCompare
用法:
const a = 'Hello'const b = 'Hell' a.localCompare(a) // 0a.localCompare(b) // 1b.localCompare(a) // -1