Який правильний спосіб перевірити рівність між рядками в JavaScript?
{} == "[object Object]"
оцінює істину.
String().equals()
це не метод у JS ...
Який правильний спосіб перевірити рівність між рядками в JavaScript?
{} == "[object Object]"
оцінює істину.
String().equals()
це не метод у JS ...
Відповіді:
завжди, поки ви повністю не зрозумієте відмінності та наслідки використанняоператорів==
та===
операторів, використовуйте===
оператор, оскільки це позбавить вас від незрозумілих (не очевидних) помилок та WTF. "Регулярний"==
оператор може мати дуже несподівані результати через внутрішньо-примусового типу, тому використання===
рекомендується завжди.
Для ознайомлення з цим та іншими частинами Javascript, що знаходяться проти поганого, читайте про містера Дугласа Крокфорда та його роботи. Там є чудовий Google Tech Talk, де він підводить багато корисної інформації: http://www.youtube.com/watch?v=hQVTIJBZook
Оновлення:
Серія " You Don't Know JS " Кайла Сімпсона є чудовою (і читати в Інтернеті безкоштовно). Серія переходить у загальнозрозумілі області мови та пояснює "погані частини", які Крокфорд пропонує вам уникати. Розуміючи їх, ви можете правильно їх використовувати і уникати підводних каменів.
Книга " Вгору та перехід " включає розділ про рівність із цим конкретним підсумком, коли використовувати оператори " вільні" ( ==
) проти "строгих" ===
:
Щоб зібрати цілу кількість деталей у декількох простих заходах і допомогти вам зрозуміти, використовувати
==
чи===
в різних ситуаціях, ось мої прості правила:
- Якщо будь-яке значення (aka side) у порівнянні могло б бути значенням
true
абоfalse
value, уникайте==
та використовуйте===
.- Якщо якесь або значення в порівнянні може бути з цих конкретних значень (
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 в рядок примітиву.
Лише одне доповнення до відповідей: Якщо всі ці методи повертають помилкові, навіть якщо рядки здаються рівними, можливо, зліва та або з правої сторони від одного рядка є пробіл. Отже, просто покладіть .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 і будь-який рядок, який відповідає йому з масиву, який у нашому випадку ми вибрали "хлопці"
Під час тестування я придумав альтернативне рішення. ви можете використовувати функцію на прототипі рядка.
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
прекрасно працює в хромованих браузерах
==
.