Каков правильный способ проверки равенства строк в JavaScript?
always Пока вы полностью не поймете различия и последствия использования операторов ==
и ===
, используйте оператор ===
, поскольку он убережет вас от непонятных (неочевидных) ошибок и WTF. Оператор "обычный" ==
может привести к очень неожиданным результатам из-за внутренней когерентности типов, поэтому всегда рекомендуется использовать ===
.
Для понимания этой и других "хороших и плохих" частей Javascript прочитайте о г-не Дугласе Крокфорде и его работе. Есть замечательный доклад Google Tech Talk, где он обобщает много полезной информации: [
Обновление:
Серия You Don't Know JS Кайла Симпсона превосходна (и ее можно бесплатно читать онлайн). В серии рассматриваются часто неправильно понимаемые области языка и объясняются "плохие части", которых Крокфорд советует избегать. Поняв их, вы сможете правильно использовать их и избежать подводных камней.
Книга "Up & Going" включает раздел Equality, в котором дается конкретный обзор того, когда следует использовать свободные (==
) и строгие (===
) операторы:
Чтобы свести множество деталей к нескольким простым выводам, и помочь вам понять, что использовать
==
или===
в различных ситуациях, вот мои простые правила:
- Если одно из значений (оно же сторона) в сравнении может быть как
истинным
, так иложным
, избегайте==
и используйте===
.- Если любое значение в сравнении может быть одним из этих конкретных значений (
0
,"""
, или[]
-- пустой массив), избегайте==
и используйте===
.- Во всех остальных случаях, вы'безопасно используете
==
. Это не только безопасно, но и во многих случаях упрощает код, улучшая его читабельность.
Я все еще рекомендую выступление Крокфорда для разработчиков, которые не хотят тратить время на понимание Javascript& mdash; это 'хороший совет для разработчика, который лишь иногда работает на Javascript.
Если вы знаете, что это строки, то нет необходимости проверять тип.
"a" == "b"
Однако обратите внимание, что строковые объекты не будут равны.
new String("a") == new String("a")
вернет false.
Вызовите метод valueOf(), чтобы преобразовать его в примитив для объектов String,
new String("a").valueOf() == new String("a").valueOf()
вернет true
Лишь одно дополнение к ответам: Если все эти методы возвращают false, даже если струны кажутся равными, вполне возможно, что есть пробел слева или справа в одну строку. Так, просто положить .отделка()
в конце строки перед сравнением:
if(s1.trim() === s2.trim())
{
// your code
}
Я потерял несколько часов, пытаясь выяснить, что случилось. Надеюсь, это поможет кому-то!
что привело меня на этот вопрос обивка
и пробелы
проверяем моем случае
if (title === "LastName")
doSomething();
и название было в " фамилия"
в
поэтому, возможно, вам придется использовать функцию TRIM`, как это
var title = $(this).text().trim();
Если вы не знаете как принуждение строительство, вы должны избежать ==
и использовать оператор идентичности===` вместо этого. Но вы должны прочитать это, чтобы понять как это работает.
Если вы будете использовать ==
, Ты давай язык сделать некоторые приведения типов для вас, так например:
"1" == 1 // true
"0" == false // true
[] == false // true
Как Дуглас Крокфорд's сказал в своей книге:
Это всегда лучше использовать оператор идентичности.
На самом деле существует два способа создания строк в 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()
Строковые объекты могут быть проверены с помощью формата JSON.stringyfy () трюк.
в
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
в
Я придумал альтернативное решение во время тестирования. вы можете использовать функцию на строку прототипа.
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
отлично работает в браузерах Хром