检查JavaScript中字符串之间的相等性的正确方法是什么?
答案 0 :(得分:560)
始终 在完全理解使用==
和===
运算符的差异和含义之前,请使用===
运算符因为它可以帮助你避免模糊(非明显)的错误和WTF。由于内部的类型强制,“常规”==
运算符可能会产生非常意外的结果,因此始终建议使用===
。
对于这一点以及对Javascript的其他“好与坏”部分的了解,请阅读Douglas Crockford先生及其作品。有一个很棒的Google Tech Talk,他总结了很多好的信息:http://www.youtube.com/watch?v=hQVTIJBZook
<强>更新强>
Kyle Simpson的You Don't Know JS系列非常出色(并且可以免费在线阅读)。该系列进入了语言中常被误解的领域,并解释了克罗克福德建议你避免的“坏部分”。通过了解它们,您可以正确使用它们并避免陷阱。
“Up & Going”一书中包含Equality部分,其中详细说明了何时使用松散(==
)vs严格(===
)运算符:
将一大堆细节归结为几个简单的小贴士,并帮助您了解在各种情况下是使用
==
还是===
,这是我的简单规则:
- 如果比较中的任何一个值(也称为边)可能是
true
或false
值,请避免使用==
并使用===
。- 如果比较中的任何一个值可能具有这些特定值(
0
,""
或[]
- 空数组),请避免==
并使用{{ 1}}。- 在所有其他情况下,您可以安全地使用
===
。它不仅安全,而且在许多情况下,它以提高可读性的方式简化了代码。
对于那些不想花时间真正理解Javascript的开发人员,我仍然推荐Crockford的演讲 - 这对于偶尔在Javascript中工作的开发人员来说是个好建议。
答案 1 :(得分:175)
如果您知道它们是字符串,则无需检查类型。
"a" == "b"
但请注意,字符串对象不相等。
new String("a") == new String("a")
将返回false。
调用valueOf()方法将其转换为String对象的基元
new String("a").valueOf() == new String("a").valueOf()
将返回true
答案 2 :(得分:42)
只有一个答案的补充:如果所有这些方法都返回false,即使字符串看起来相等,也可能在一个字符串的左侧或右侧有一个空格。所以,在比较之前,只需在字符串的末尾添加.trim()
:
if(s1.trim() === s2.trim())
{
// your code
}
我花了很多时间试图找出问题所在。 希望这会对某人有所帮助!
答案 3 :(得分:17)
答案 4 :(得分:14)
导致我这个问题的是padding
和white-spaces
检查我的案例
if (title === "LastName")
doSomething();
且标题为" LastName"
所以也许你必须使用
trim
这样的功能
var title = $(this).text().trim();
答案 5 :(得分:12)
除非你真的知道强制是如何运作的,否则你应该避免==
并改为使用身份运算符===
。但你应该read this to understand how it works。
如果你使用==
,你可以让语言为你做一些类型强制,例如:
"1" == 1 // true
"0" == false // true
[] == false // true
道格拉斯·克罗克福德在他的书中说:
总是更好地使用身份运算符。
答案 6 :(得分:2)
可以使用此技巧Objects
来检查字符串JSON.stringyfy()
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
答案 7 :(得分:1)
考虑到两个字符串可能都很大,有两种主要方法bitwise search
和localeCompare
我推荐了此功能
function compareLargeStrings(a,b){
if (a.length !== b.length) {
return false;
}
return a.localeCompare(b) === 0;
}
答案 8 :(得分:0)
要进行简单比较,请使用 ===
来检查严格相等性。正如其他人所说,这具有最高效和减少错误或不确定代码机会的优点。资料来源:MDN Web Docs: Strict Equality。
var a = "hello1";
var b = "hello2";
console.log("a === a?" + (a === a) + "|");
console.log("a === b?" + (a === b) + "|");
如果您想比较两个字符串以了解一个字符串是在另一个字符串之前还是之后,基于自然排序,请使用 <
、>
、<=
和 {{ 1}} 运算符。来源:<
、>
、<=
和 >=
的 MDN WebDocs。
>=
答案 9 :(得分:-5)
在测试期间,我想出了一个替代解决方案。 您可以在字符串原型上使用函数。
String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value
在chrome浏览器中工作正常