Как правильно проверить равенство строк в JavaScript?
javascript
string
JSS
источник
источник
{} == "[object Object]"
оценивается как true, например.String().equals()
это не метод в JS ...Ответы:
всегдаПока вы полностью не понять различия и последствия использования==
и===
операторов, используйте===
оператортак как это избавит вас от непонятных (неочевидных) ошибок и WTFs. «Обычный»==
оператор может иметь очень неожиданные результаты из-за приведения типов внутри, поэтому использование===
всегда является рекомендуемым подходом.Для понимания этого и других «хороших и плохих» частей Javascript прочитайте о Дугласе Крокфорде и его работе. В Google Tech Talk есть отличная информация: http://www.youtube.com/watch?v=hQVTIJBZook
Обновить:
Серия « Вы не знаете » от Кайла Симпсона превосходна (и бесплатна для чтения онлайн). Эта серия статей посвящена часто неправильно понимаемым областям языка и объясняет «плохие стороны», которые Крокфорд предлагает вам избегать. Поняв их, вы сможете правильно их использовать и избежать подводных камней.
Книга " Up & Going " содержит раздел, посвященный равенству , в котором содержится конкретное описание того, когда следует использовать операторы верстки (
==
) и строгого (===
):Я по-прежнему рекомендую выступление Крокфорда для разработчиков, которые не хотят тратить время на то, чтобы по-настоящему понять Javascript - это хороший совет для разработчика, который лишь изредка работает в Javascript.
источник
if (typeof foo == "string")
===
оператора и никогда не беспокоиться о том, "действительно ли я на 100% уверен, что==
будет вести себя так, как я думаю?"++
/--
).++
или--
или однострочныеif/else
заявления илиcontinue
илиnew
оператор или любое другое число совершенно законных методы коды, Крокфорд счел «вредным». И, конечно , никогда никогда даже рассматривать думать об использованииeval
илиwith
даже если их подводные камни , хорошо понятны. А вы видели следующую версию JS? Более строгий синтаксис и несколько вспомогательных функций, некоторые из которых используются годами, - это почти все, что мы получаем после всего этого времени. Синтаксис не развивался вообще. Если за этим стоит Крокфорд, то это было плохо.Если вы знаете, что это строки, то нет необходимости проверять тип.
Однако обратите внимание, что строковые объекты не будут равны.
вернет ложь.
Вызовите метод valueOf (), чтобы преобразовать его в примитив для объектов String,
вернет истину
источник
new String("a") == "a"
это правда (но не будет===
), потому что левая часть будет преобразована в примитивное строковое значение.new String("a") == new String("a")
,new String("a") === new String("b")
,new String("a") === new String("a")
будет все возвращаетсяfalse
, так как вы имеете дело со ссылками на объектыString
класса, а не примитивы типаstring
.new String(foo)
создает строковый объект иString(foo)
преобразует foo в строковый примитив.Только одно дополнение к ответам: если все эти методы возвращают false, даже если строки кажутся равными, возможно, что есть пробел слева или справа от одной строки. Итак, просто поместите
.trim()
в конец строки перед сравнением:Я потерял часы, пытаясь понять, что не так. Надеюсь, это кому-нибудь поможет!
источник
fetch
). Большое спасибо.что привело меня к этому вопросу
padding
иwhite-spaces
проверь мой случай
и название было
" LastName"
источник
.toString().trim()
вЕсли вы действительно не знаете, как работает принуждение, вам следует избегать
==
и использовать===
вместо этого оператор идентификации . Но вы должны прочитать это, чтобы понять, как это работает .Если вы используете
==
, вы позволяете языку выполнять какое-то приведение типов, например:Как сказал Дуглас Крокфорд в своей книге:
источник
{}==" "
дал мне,Unexpected token ==
как правильно это сделать?На самом деле есть два способа сделать строки в javascript.
var str = 'Javascript';
Это создает примитивное строковое значение.var obj = new String('Javascript');
Это создает объект-оболочку типаString
.typeof str // string
typeof obj // object
Поэтому лучший способ проверить равенство - использовать
===
оператор, поскольку он проверяет значение, а также тип обоих операндов.Если вы хотите проверить равенство между двумя объектами, используйте
String.prototype.valueOf
правильный путь.источник
Строка
Objects
может быть проверена с помощьюJSON.stringyfy()
трюка.источник
Учитывая, что обе строки могут быть очень большими, есть 2 основных подхода
bitwise search
иlocaleCompare
Я рекомендовал эту функцию
источник
Самый простой способ сделать это - использовать троичный оператор, например, так:
но если строка, которую вы хотите сравнить, находится в массиве, вы будете использовать фильтр es6
выше будет проверять ваш stringArray и любую строку, которая соответствует ему из массива, который в нашем случае мы выбрали "boys"
источник
Я придумал альтернативное решение во время тестирования. Вы можете использовать функцию на прототипе строки.
отлично работает в браузерах Chrome
источник
==
.