JavaScriptで文字列が等しいかどうかを確認する正しい方法は何ですか?


844

JavaScriptの文字列が等しいかどうかを確認する正しい方法は何ですか?


2
==を使用しない理由はありますか?
ケンドリック

21
@ケンドリック-確かに。型強制システムは信じられないほど直感的でなく、エラーを非常に見落とす可能性があります(正しく見えますが、非常に間違っている可能性があります)
STW

20
@Kendrick- {} == "[object Object]"たとえば、trueと評価されるため。
Chetan Sastry、2010

12
String().equals()JSのメソッドではない、やや煩わしい…
Alexander Mills

2
@AlexanderMillsなんで?
Ry-

回答:


624

いつもあなたが完全に違いや使用する意味を理解するまで、==および===演算子を使用する===ことがあいまい(非自明な)バグやWTFsからあなたを救うため、演算子を。「通常の」==演算子は、内部で型強制が行われるため、非常に予期しない結果になる可能性があるため、===常に使用することをお勧めします。

これについての洞察、およびJavaScriptの他の「良い点と悪い点」の部分について、Douglas Crockford氏と彼の研究について読んでください。彼がたくさんの良い情報を要約する素晴らしいGoogle Tech Talkがあります:http : //www.youtube.com/watch?v=hQVTIJBZook


更新:

カイル・シンプソンの「You Do n't Know JS」シリーズは優れています(オンラインで無料で読むことができます)。このシリーズでは、よく誤解されている言語の領域を取り上げ、Crockfordが回避するよう提案した「悪い部分」について説明します。それらを理解することで、それらを適切に使用し、落とし穴を避けることができます。

アップ&ゴーイング」本は、上のセクションが含ま平等を(緩んを使用するときのこの特定の要約で、==厳格な(VS) ===)演算子:

多くの詳細をいくつかの簡単な要点に要約し、使用するかどうか、==または===さまざまな状況で使用するかどうかを知るのに役立つように、ここに簡単なルールを示します。

  • 比較のどちらかの値(別名)がtrueor false値である可能性がある場合は、==を使用しないでください===
  • 比較のいずれかで値がこれらの特定の値(とすることができれば0""または[]、避ける-空の配列)==と使用===
  • それ以外の場合はすべて、安全に使用できます==。安全であるだけでなく、多くの場合、読みやすさを向上させる方法でコードを簡素化します。

JavaScriptを本当に理解するために時間を費やしたくない開発者には、まだCrockfordの講演をお勧めします。これは、たまにしかJavaScriptで作業しない開発者には良いアドバイスです。


7
あなたは必ず両方のオペランドが、例えば、使用して文字列されているとき、それは必要はありませんif (typeof foo == "string")
マルセルKorpel

25
@Marcel-正しいですが、常に===演算子を使用し、「本当に、完全に、100%確実に、==私が思うように動作するかどうか」を心配する必要はありません。
STW 2010

7
@STW – CrockfordがJavaScriptのアルファおよびオメガではない理由の1つは、単項インクリメント/デクリメント(++/ --)を使用しないようにという彼のアドバイスです。
Marcel Korpel、2010

10
そして、使用することはありません++か、--単一ラインまたはif/else文またはcontinueまたはnewオペレータまたはクロックフォードが「有害」と認めていることを完全に正当なコード慣行他の任意の数を。そしてもちろん決して、これまでにも使用することについて考えて検討していないevalか、withその落とし穴はよく理解されている場合でも。そして、あなたはJSの次のバージョンを見ましたか?厳密な構文といくつかのヘルパー関数(何年もの間浮かんでいるもの)は、今のところ結局のところすべてです。構文はまったく進化していません。クロックフォードがこの背後にある場合、それは悪いことです。
MooGoo 2010

4
@CoffeeAddict-JSFiddleでの簡単なテストは同意しないようです。どちらも大文字と小文字が区別されます。jsfiddle.net
STW

205

それらが文字列であることがわかっている場合は、型を確認する必要はありません。

"a" == "b"

ただし、文字列オブジェクトは等しくないことに注意してください。

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

falseを返します。

valueOf()メソッドを呼び出して、Stringオブジェクトのプリミティブに変換します。

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

trueを返します


4
そのJSSに感謝します。2つの文字列オブジェクトは、値に関係なく同じオブジェクトでない限り、決して等しくなることはありません。
Anurag 2010

4
@JSS:さらに、左側がプリミティブ文字列値に変換されるため、new String("a") == "a"trueです(ただし、ではありません===)。
Matthew Crumley、2010

5
@JSS: 、、new String("a") == new String("a") すべてのリターンはなりますが、のオブジェクトへの参照を扱っていることから、クラス、タイプのプリミティブではありません。new String("a") === new String("b")new String("a") === new String("a")falseStringstring
palswim 2010

4
それを読む人のためにこれを明確にするためだけに。 new String(foo)文字列の作成オブジェクトを、およびString(foo) 変換プリミティブ文字列にFOOを。
ブリガンド2013

9
@FakeRainBrigand-泥のようにはっきりしていますが、それはjavascriptsに関するものですよね。
Periata Breatta 16

59

回答への1つの追加:これらのすべてのメソッドがfalseを返す場合、文字列が等しいように見えても、1つの文字列の左側または右側に空白がある可能性があります。したがって、.trim()比較する前に文字列の最後にa を置くだけです。

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

私は何が悪いのかを理解しようとすることに何時間も費やしてきました。これが誰かに役立つことを願っています!


1
どうもありがとう。でも、奇妙なことに、左右に空白がないことを確認しましたが、これが問題を解決する唯一の方法でした。多分それは文字列の内部表現に関連していますか?
ニコ、

2
ありがとう@akelec !! @Niko、それは肉眼では見えないZero-Width-Space文字が原因であったと思われます。en.wikipedia.org/wiki/Zero-width_spaceを参照してください。このキャラクターには目的がありますが、多くの開発者はその存在に憤慨しています!
stwr667 2018

私のifの等価チェックが失敗したので、イライラしていたことに感謝します。デバッグ中に検査するときに空白が表示されませんでした。
drzounds 2018年

テキストファイルから変数をロードするときの一般的な問題(つまり、の使用fetch)。どうもありがとう。
ソパラホデアリエーレス

@SopalajodeArrierez、正確には、文字列の最後にスペースまたはキャリッジリターンがほとんどあります。どういたしまして。
akelec

22

何この質問に私を導いたことはあるpaddingwhite-spaces

私のケースをチェック

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

そしてタイトルは " LastName"

ここに画像の説明を入力してください

だから多分あなたはtrimこのような関数を使わなければならない

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

2
.toString().trim()
Typescriptで

17

強制がどのように機能するかを本当に理解していない限り、代わりに==ID演算子を使用しないでください===しかし、それがどのように機能するかを理解するためにこれを読むべきです。

を使用する==と、言語に何らかの型強制を行わせることができます。たとえば、次のようにします。

"1" == 1 // true
"0" == false // true
[] == false // true

ダグラス・クロックフォードが彼の本で言ったように:

常にアイデンティティ演算子を使用する方が適切です。


3
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
Parkash Kumar 2015

{}==" "私が与えたUnexpected token ==それを行うための正しい方法をいただきましたか!?
Basheer AL-MOMANI 2018年

12

JavaScriptで文字列を作成する方法は2つあります。

  1. var str = 'Javascript'; これにより、プリミティブな文字列値が作成されます。

  2. var obj = new String('Javascript');これにより、タイプのラッパーオブジェクトが作成されますString

    typeof str // string
    typeof obj // object

したがって、===値をチェックすると同時に両方のオペランドのタイプをチェックするため、等価性をチェックする最良の方法は演算子を使用することです。

2つのオブジェクトが等しいかどうかを確認する場合String.prototype.valueOfは、正しい方法を使用します。

new String('javascript').valueOf() == new String('javascript').valueOf()

6

文字列ObjectsJSON.stringyfy()トリックを使用してチェックできます。

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);


1

両方の文字列が非常に大きくなる可能性があることを考慮して、2つの主要なアプローチbitwise searchlocaleCompare

この機能をおすすめしました

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

-2

これを行う最も簡単な方法は、次のような三項演算子を使用することです。

 "was" == "was" ? true : false

ただし、比較する文字列が配列内にある場合は、es6フィルターを使用します

let stringArray  = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ? 
stringArray.pop(indexOf(I)) : null)

上記では、stringArrayと、それに一致するすべての文字列をチェックします。この例では、「boys」を選択しました。


-8

テスト中に代替ソリューションを思いつきました。文字列プロトタイプで関数を使用できます。

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ブラウザで正常に動作します


「hello world」が文字列かどうかを確認する方法ではなく、「hello world」=「hello world」かどうかを確認する方法を質問します。
Nick

4
これはばかげています。のRube Goldbergバージョンを作成しました==
JJJ 2018年

こんにちはOP、あなたの編集は精神的な部分で完全に異なります、そしてあなたの答えはすでにあまりにも多くの反対票を得ています。私はあなたがこの回答を削除して、編集したバージョンで新しいものを投稿する喜ば促す
ユルマズDurmaz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.