ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中检查字符串是否相等的正确方法是什么?

在 JavaScript 中检查字符串是否相等的正确方法是什么?

有理由不使用 == 吗?
@Kendrick——当然。它的类型强制系统可能非常不直观,并且很容易忽略错误(它看起来正确,但可能非常错误)
@Kendrick - 例如,因为 {} == "[object Object]" 的计算结果为真。
有点烦人的是 String().equals() 不是 JS 中的方法......
@AlexanderMills 为什么?

S
STW

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 工作的开发人员来说,这是一个很好的建议。


如果您确定两个操作数都是字符串,例如使用 if (typeof foo == "string") 时,则不需要
@Marcel——你是对的,但最好总是使用 === 运算符,而不必担心“我真的,完全,100% 肯定 == 会按照我的想法行事?”
@STW – Crockford 不是 JavaScript 的 alpha 和 omega 的一个例子是,他建议不要使用一元递增/递减 (++/--)。
切勿使用 ++-- 或单行 if/else 语句或 continuenew 运算符或 Crockford 认为“有害”的任何其他数量的完全合法的代码实践。当然,从来没有曾经考虑过使用 evalwith,即使它们的陷阱已经很清楚了。你见过 JS 的下一个版本吗?更严格的语法和少量的辅助函数,其中一些已经流传了多年,这就是我们在这段时间里得到的一切。语法根本没有发展。如果克罗克福德是这件事的幕后黑手,那将是一件坏事。
@CoffeeAddict - JSFiddle 中的快速测试似乎不同意。它们都区分大小写:jsfiddle.net/st2EU
A
Anurag

如果您知道它们是字符串,则无需检查类型。

"a" == "b"

但是,请注意字符串对象不会相等。

new String("a") == new String("a")

将返回假。

调用 valueOf() 方法将其转换为 String 对象的原语,

new String("a").valueOf() == new String("a").valueOf()

将返回真


感谢 JSS,两个字符串对象永远不会相等,除非它们是同一个对象,而不管值如何。
@JSS:另外,new String("a") == "a" 为真(但不会与 === 一起使用),因为左侧将被转换为原始字符串值。
@JSS: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 为一个字符串原语。
@FakeRainBrigand - 像泥巴一样清晰,但这就是 javascripts 的意义所在,不是吗?
a
akelec

只是对答案的一个补充:如果所有这些方法都返回 false,即使字符串看起来相等,也可能在一个字符串的左侧和或右侧有一个空格。因此,只需在比较之前将 .trim() 放在字符串的末尾:

if(s1.trim() === s2.trim())
{
    // your code
}

我已经浪费了几个小时试图找出问题所在。希望这对某人有帮助!


非常感谢。不过这对我来说很奇怪,因为我确保左侧或右侧没有空格,但这仍然是解决我的问题的唯一方法。也许它与字符串的内部表示有关?
谢谢@akelec!! @Niko,这可能是由于肉眼看不见的零宽度空间字符。请参阅en.wikipedia.org/wiki/Zero-width_space。尽管这个角色有它的用途,但许多开发者都讨厌它的存在!
谢谢你,因为我的 if 中的相等检查失败但我在调试时检查时没有看到空格,这很令人沮丧。
从文本文件加载变量时的常见问题(即:使用 fetch)。非常感谢。
这是最好的答案。
K
Kamil Kiełczewski

您可以使用 =====,但最后一个以更简单的方式工作 (src)

a == b (及其否定!=)

https://i.stack.imgur.com/nkpj6.png

a === b(及其否定!==)

https://i.stack.imgur.com/DIqvq.png


至少'=='是对称的... |-=)
@Lars 不完全是:if("0"==0 && 0==[]) console.log("0"==[]);
ment if a==b then b==a for all a and b
@Lars 它像你说的那样是对称的,但是......它是 JS :P
B
Basheer AL-MOMANI

导致我提出这个问题的是 paddingwhite-spaces

检查我的情况

 if (title === "LastName")
      doSomething();

标题是 " LastName"

https://i.stack.imgur.com/XCo3c.png

所以也许你必须使用这样的修剪功能

var title = $(this).text().trim();

谢谢,我在 Typescript 中使用了 .toString().trim()
A
Abhishek

实际上有两种方法可以在 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()

D
Dunc

可以使用 JSON.stringify() 技巧检查字符串 Objects

var me = new String("me"); var you = new String("me"); var isEquel = JSON.stringify(me) === JSON.stringify(you);控制台.log(isEquel);


你在开玩笑吧?你的意思是 iSequel 吗?) 开个玩笑……
H
HoldOffHunger

严格比较

要进行简单比较,请使用 === 检查严格相等。正如其他人所说,这具有最高效和减少错误或不确定代码的机会的优点。来源: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) + "|");


N
Nagibaba

考虑到两个字符串可能都很大,主要有两种方法bitwise searchlocaleCompare

我推荐了这个功能

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}

g
grssnbchr

还要考虑 ["foo", "bar"] == "foo,bar"