Каков правильный способ проверки равенства строк в 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"
так что, возможно, вам придется использовать функцию
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