Каков правильный способ проверки равенства строк в JavaScript?

Каков правильный способ проверки равенства строк в JavaScript?

Ответ 1

always Пока вы не поймете различия и последствия использования операторов == и ===, используйте оператор ===, так как он избавит вас от непонятных (неочевидных) ошибок и WTF. "Обычный" == оператор может иметь очень неожиданные результаты из-за внутреннего принуждения типа, поэтому использование === всегда рекомендуется.

Для понимания этого и других "хороших против плохих" частей Javascript, прочитанных г-ном Дугласом Крокфордом и его работой. Там отличный Tech Tech Tech, где он обобщает много полезной информации: http://www.youtube.com/watch?v=hQVTIJBZook


Update:

Серия You Do not Know JS от Kyle Simpson отличная (и бесплатна для чтения в Интернете). Серия входит в часто неправильно понятые области языка и объясняет "плохие части", которые Крокфорд предлагает вам избежать. Понимая их, вы можете правильно их использовать и избегать подводных камней.

В книге Up and Going содержится раздел Equality, с этим конкретным резюме о том, когда использовать свободные (==) и строгие (===) операторы:

Чтобы свернуть множество деталей до нескольких простых выписок и помочь вам узнать, следует ли использовать == или === в различных ситуациях, вот мои простые правила:

  • Если любое значение (aka side) в сравнении может быть значением true или false, избегайте == и используйте ===.
  • Если любое значение в сравнении может быть из этих конкретных значений (0, "" или [] - пустой массив), избегайте == и используйте ===.
  • Во всех остальных случаях вы можете использовать ==. Это не только безопасно, но во многих случаях упрощает ваш код таким образом, чтобы улучшить читаемость.

Я по-прежнему рекомендую Crockford говорить для разработчиков, которые не хотят вкладывать время, чтобы действительно понять Javascript — это хороший совет для разработчика, который только изредка работает в Javascript.

Ответ 2

Если вы знаете, что это строки, тогда нет необходимости проверять тип.

"a" == "b"

Однако обратите внимание, что строковые объекты не будут равны.

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

вернет false.

Вызвать метод valueOf(), чтобы преобразовать его в примитив для объектов String,

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

вернет true

Ответ 3

Только одно дополнение к ответам: если все эти методы возвращают false, даже если строки кажутся равными, возможно, что есть пробел слева или справа от одной строки. Итак, просто поместите .trim() в конец строки перед сравнением:

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

Я потерял часы, пытаясь понять, что не так. Надеюсь, это кому-нибудь поможет!

Ответ 4

что привело меня к этому вопросу, это padding и white-spaces

проверь мой случай

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

и заголовок был " LastName"

enter image description here

так что, возможно, вам придется использовать функцию trim как это

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

Ответ 5

Если вы действительно не знаете, как работает принуждение, вы должны избегать == и вместо этого использовать оператор идентификации ===. Но вы должны прочитайте это, чтобы понять, как это работает.

Если вы используете ==, вы даете языку какое-то принуждение типа для вас, например:

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

Как сказал Дуглас Крокфорд в своей книге:

Его всегда лучше использовать тождественный оператор.

Ответ 6

На самом деле существует два способа, с помощью которых строки могут быть созданы в javascript.

  • var str = 'Javascript'; Это создает примитивное строковое значение.

  • var obj = new String('Javascript'); Это создает объект-оболочку типа String.

    typeof str // string
    typeof obj // object

Таким образом, лучший способ проверить равенство - использовать оператор ===, потому что он проверяет значение, а также тип обоих операндов.

Если вы хотите проверить равенство между двумя объектами, используйте String.prototype.valueOf правильный путь.

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

Ответ 7

Строковые Objects можно проверить с помощью JSON.stringyfy().

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

Ответ 8

Я предоставил некоторый код (так же, как показано ниже), чтобы объяснить сравнение преобразования типов JavaScript с примерами.

<!-- 

JavaScript has both strict and type-converting equality comparison. For strict equality the objects being compared must have the same
type, presented by  === (the triple equal sign). For strict equality, the objects being compared must be equal in type as well. 
Below I am going to provide you couple examples, I hope they help you!

Please, don't forget to like my code. Thank you!

-->

<!DOCTYPE html>
<html>
    <body>

    <p id="demo"></p>

    <script>

        document.write("The == and === comparison"  + "<br>" + "<br>");
        //document.write(" (0 == false)  returns: " + (0 == false)  + "<br>");   // true


        document.write((0 == false)  + "<br>");   // true

        document.write((0 === false) + "<br>");  // false, because they are of a different type

        document.write((1 == "1" ) + "<br>");    // true, automatic type conversion for value only

        document.write((1 === "1" ) + "<br>");   // false, because they are of a different type

        document.write(('0' == false) + "<br>"); // true

        document.write(('0' === false) + "<br>"); // false   

        document.write((2==='2') + "<br>"); //false

        document.write((2==="2") + "<br>"); //false

        document.write(("2"===2) + "<br>"); //true

        document.write((2===2) + "<br>"); //true

        document.write(("3"==3) + "<br>"); //true

        document.write((3=='3') + "<br>"); //true

        document.write((3==true) + "<br>"); //false


        /*Two numbers are strictly equal when they are numerically equal (have the same number value).  */
        document.write((3==3) + "<br>"); //true
        document.write((5.2==5.2) + "<br>"); //true


        /* Two strings are strictly equal when they have the same sequence of characters, same length, 
            and same characters in corresponding positions. */
        document.write(("hola"=="hola") + "<br>"); //true
        document.write(("hola"=="Hola") + "<br>"); //false, because they differ in a character 'H'


        /* NaN is not equal to anything, including NaN. Positive and negative zeros are equal to one another. */
        document.write(("NaN"=="hola") + "<br>"); //false
        document.write(("NaN"== -3) + "<br>"); //false
        document.write(("NaN"== 3) + "<br>"); //false
        document.write(("NaN"== 2.5) + "<br>"); //false


        /* Two Boolean operands are strictly equal if both are true or both are false. */
        document.write(((0 > 5) == (8 < 9 )) + "<br>"); // false, the first condition (0>5) returns false and (8<9) returns true
        document.write(((8 >= 5) == (8 == 9 )) + "<br>"); // false, the first condition (8>=5) returns true and (8==9) returns false
        document.write(((true) == (true)) + "<br>"); // true
        document.write(((false) == (false)) + "<br>"); // true


         /* Null and Undefined types are == (but not ===). [e.g.: (Null==Undefined) is true but (Null===Undefined) is false] */
        document.write((null == undefined) + "<br>"); // true
        document.write((null === undefined) + "<br>"); // false


        /* 
        Two objects are strictly equal if they refer to the same Object.
        */
        var car1 = {type:"Fiat", model:"500", color:"white"};
        var car2 = {type:"Fiat", model:"500", color:"white"};
        var x = car1;

        document.write((car1 === car2)+ "<br> "); // false
        document.write((car1 == car2)+ "<br> "); // false
        document.write((car1 === x)+ "<br> "); // true
        document.write((car1 == x)+ "<br>"); // true



       /* DO NOT FORGET THAT = (a single equal sign) represents assignment. e.g.: var X = 3;
         Here we were assigning 3 to variable X
       */

    </script>

    </body>
</html>

Ответ 9

Я придумал альтернативное решение во время тестирования. Вы можете использовать функцию на прототипе строки.

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