在 JavaScript 中检查字符串是否相等的正确方法是什么?
{} == "[object Object]"
的计算结果为真。
String().equals()
不是 JS 中的方法......
always 在您完全理解使用 ==
和 ===
运算符的区别和含义之前,请使用 ===
运算符,因为它可以帮助您避免晦涩(非-明显的)错误和WTF。由于内部类型强制,“常规”==
运算符可能会产生非常意外的结果,因此始终推荐使用 ===
。
为了深入了解这一点,以及 Javascript 的其他“好与坏”部分,请阅读 Douglas Crockford 先生和他的工作。有一个很棒的 Google 技术讲座,他总结了很多有用的信息:http://www.youtube.com/watch?v=hQVTIJBZook
更新:
Kyle Simpson 的 You Don't Know JS 系列非常出色(可免费在线阅读)。该系列进入了该语言中通常被误解的领域,并解释了 Crockford 建议您避免的“坏部分”。通过了解它们,您可以正确使用它们并避免陷阱。
“Up & Going”一书中包含有关 Equality 的部分,其中具体总结了何时使用松散 (==
) 与严格 (===
) 运算符:
为了将大量细节归结为一些简单的要点,并帮助您了解在各种情况下是否使用 == 或 ===,以下是我的简单规则:如果比较中的任何一个值(也称为边)可能是true 或 false 值,避免 == 并使用 ===。如果比较中的任一值可能是这些特定值(0、“”或 [] - 空数组),请避免使用 == 并使用 ===。在所有其他情况下,您可以安全地使用 ==。它不仅安全,而且在许多情况下,它以提高可读性的方式简化了您的代码。
对于不想花时间真正理解 Javascript 的开发人员,我仍然推荐 Crockford 的演讲——对于偶尔使用 Javascript 工作的开发人员来说,这是一个很好的建议。
如果您知道它们是字符串,则无需检查类型。
"a" == "b"
但是,请注意字符串对象不会相等。
new String("a") == new String("a")
将返回假。
调用 valueOf() 方法将其转换为 String 对象的原语,
new String("a").valueOf() == new String("a").valueOf()
将返回真
new String("a") == "a"
为真(但不会与 ===
一起使用),因为左侧将被转换为原始字符串值。
new String("a") == new String("a")
、new String("a") === new String("b")
、new String("a") === new String("a")
都将返回 false
,因为您处理的是对 String
类对象的引用,而不是 string
类型的原语。
new String(foo)
创建一个字符串 object,然后 String(foo)
converts foo 为一个字符串原语。
只是对答案的一个补充:如果所有这些方法都返回 false,即使字符串看起来相等,也可能在一个字符串的左侧和或右侧有一个空格。因此,只需在比较之前将 .trim()
放在字符串的末尾:
if(s1.trim() === s2.trim())
{
// your code
}
我已经浪费了几个小时试图找出问题所在。希望这对某人有帮助!
fetch
)。非常感谢。
您可以使用 ==
或 ===
,但最后一个以更简单的方式工作 (src)
a == b (及其否定!=)
https://i.stack.imgur.com/nkpj6.png
a === b(及其否定!==)
https://i.stack.imgur.com/DIqvq.png
if("0"==0 && 0==[]) console.log("0"==[]);
导致我提出这个问题的是 padding
和 white-spaces
检查我的情况
if (title === "LastName")
doSomething();
标题是 " LastName"
https://i.stack.imgur.com/XCo3c.png
所以也许你必须使用这样的修剪功能
var title = $(this).text().trim();
.toString().trim()
实际上有两种方法可以在 javascript 中创建字符串。
var str = 'Javascript';这将创建一个原始字符串值。 var obj = new String('Javascript');这将创建一个 String 类型的包装器对象。 typeof str // 字符串 typeof obj // 对象
因此,检查相等性的最佳方法是使用 ===
运算符,因为它会检查两个操作数的值和类型。
如果要检查两个对象之间的相等性,则使用 String.prototype.valueOf
是正确的方法。
new String('javascript').valueOf() == new String('javascript').valueOf()
可以使用 JSON.stringify()
技巧检查字符串 Objects
。
var me = new String("me"); var you = new String("me"); var isEquel = JSON.stringify(me) === JSON.stringify(you);控制台.log(isEquel);
严格比较
要进行简单比较,请使用 ===
检查严格相等。正如其他人所说,这具有最高效和减少错误或不确定代码的机会的优点。来源:MDN Web Docs: Strict Equality。
var a = "你好1"; var b = "你好2"; console.log("a === a?" + (a === a) + "|"); console.log("a === b?" + (a === b) + "|");
字母比较
如果要比较两个字符串以了解一个字符串是在另一个字符串之前还是之后,基于自然排序,请使用 <
、>
、<=
和 >=
运算符。来源:<
、>
、<=
和 >=
的 MDN WebDocs。
var a = "你好1"; var b = "你好2"; console.log("a < a?" + (a < a) + "|"); console.log("a < b?" + (a < b) + "|"); console.log("a > b?" + (a > b) + "|"); console.log("b > a?" + (b > a) + "|");
考虑到两个字符串可能都很大,主要有两种方法bitwise search
和localeCompare
我推荐了这个功能
function compareLargeStrings(a,b){
if (a.length !== b.length) {
return false;
}
return a.localeCompare(b) === 0;
}
还要考虑 ["foo", "bar"] == "foo,bar"
。
不定期副业成功案例分享
if (typeof foo == "string")
时,则不需要===
运算符,而不必担心“我真的,完全,100% 肯定==
会按照我的想法行事?”++
/--
)。++
或--
或单行if/else
语句或continue
或new
运算符或 Crockford 认为“有害”的任何其他数量的完全合法的代码实践。当然,从来没有曾经考虑过使用eval
或with
,即使它们的陷阱已经很清楚了。你见过 JS 的下一个版本吗?更严格的语法和少量的辅助函数,其中一些已经流传了多年,这就是我们在这段时间里得到的一切。语法根本没有发展。如果克罗克福德是这件事的幕后黑手,那将是一件坏事。