Как правильно проверить равенство строк в JavaScript?
{} == "[object Object]"
оценивается как true, например.
String().equals()
это не метод в JS ...
Как правильно проверить равенство строк в JavaScript?
{} == "[object Object]"
оценивается как true, например.
String().equals()
это не метод в JS ...
Ответы:
всегда Пока вы полностью не понять различия и последствия использования==
и===
операторов, используйте===
оператортак как это избавит вас от непонятных (неочевидных) ошибок и WTFs. «Обычный»==
оператор может иметь очень неожиданные результаты из-за приведения типов внутри, поэтому использование===
всегда является рекомендуемым подходом.
Для понимания этого и других «хороших и плохих» частей Javascript прочитайте о Дугласе Крокфорде и его работе. В Google Tech Talk есть отличная информация: http://www.youtube.com/watch?v=hQVTIJBZook
Обновить:
Серия « Вы не знаете » от Кайла Симпсона превосходна (и бесплатна для чтения онлайн). Эта серия статей посвящена часто неправильно понимаемым областям языка и объясняет «плохие стороны», которые Крокфорд предлагает вам избегать. Поняв их, вы сможете правильно их использовать и избежать подводных камней.
Книга " Up & Going " содержит раздел, посвященный равенству , в котором содержится конкретное описание того, когда следует использовать операторы верстки ( ==
) и строгого ( ===
):
Чтобы свести все детали к нескольким простым выносам и помочь вам узнать, использовать ли они
==
или===
в различных ситуациях, вот мои простые правила:
- Если какое-либо значение (иначе сторона) в сравнении может быть значением
true
илиfalse
, избегайте==
и используйте===
.- Если какое- либо значение в сравнении может быть из этих конкретных значений (
0
,""
или[]
- пустой массив), избегать==
и использования===
.- Во всех остальных случаях вы безопасны в использовании
==
. Это не только безопасно, но и во многих случаях упрощает ваш код таким образом, чтобы улучшить читаемость.
Я по-прежнему рекомендую выступление Крокфорда для разработчиков, которые не хотят тратить время на то, чтобы по-настоящему понять Javascript - это хороший совет для разработчика, который лишь изредка работает в Javascript.
if (typeof foo == "string")
===
оператора и никогда не беспокоиться о том, "действительно ли я на 100% уверен, что ==
будет вести себя так, как я думаю?"
++
/ --
).
++
или --
или однострочные if/else
заявления или continue
или new
оператор или любое другое число совершенно законных методы коды, Крокфорд счел «вредным». И, конечно , никогда никогда даже рассматривать думать об использовании eval
или with
даже если их подводные камни , хорошо понятны. А вы видели следующую версию JS? Более строгий синтаксис и несколько вспомогательных функций, некоторые из которых используются годами, - это почти все, что мы получаем после всего этого времени. Синтаксис не развивался вообще. Если за этим стоит Крокфорд, то это было плохо.
Если вы знаете, что это строки, то нет необходимости проверять тип.
"a" == "b"
Однако обратите внимание, что строковые объекты не будут равны.
new String("a") == new String("a")
вернет ложь.
Вызовите метод valueOf (), чтобы преобразовать его в примитив для объектов String,
new String("a").valueOf() == new String("a").valueOf()
вернет истину
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()
в конец строки перед сравнением:
if(s1.trim() === s2.trim())
{
// your code
}
Я потерял часы, пытаясь понять, что не так. Надеюсь, это кому-нибудь поможет!
fetch
). Большое спасибо.
что привело меня к этому вопросу padding
иwhite-spaces
проверь мой случай
if (title === "LastName")
doSomething();
и название было " LastName"
так что, возможно, вам придется использовать
trim
такую функцию
var title = $(this).text().trim();
.toString().trim()
в
Если вы действительно не знаете, как работает принуждение, вам следует избегать ==
и использовать ===
вместо этого оператор идентификации . Но вы должны прочитать это, чтобы понять, как это работает .
Если вы используете ==
, вы позволяете языку выполнять какое-то приведение типов, например:
"1" == 1 // true
"0" == false // true
[] == false // true
Как сказал Дуглас Крокфорд в своей книге:
Всегда лучше использовать оператор идентификации.
{}==" "
дал мне, Unexpected token ==
как правильно это сделать?
На самом деле есть два способа сделать строки в 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()
Строка Objects
может быть проверена с помощью JSON.stringyfy()
трюка.
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Самый простой способ сделать это - использовать троичный оператор, например, так:
"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"
Я придумал альтернативное решение во время тестирования. Вы можете использовать функцию на прототипе строки.
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
==
.