Добавление операторов IF для выполнения валидации из форм [duplicate]

Мы не можем привязать это к setTimeout(), поскольку он всегда выполняется с глобальным объектом (Window), если вы хотите получить доступ к контексту this в функции обратного вызова, а затем с помощью bind() к функции обратного вызова, которую мы можем достичь как:

setTimeout(function(){
    this.methodName();
}.bind(this), 2000);
636
задан Kevin B 18 December 2015 в 00:17
поделиться

8 ответов

На самом деле существует два способа, с помощью которых строки могут быть созданы в javascript.

  1. var str = 'Javascript'; Это создает примитивное строковое значение.
  2. var obj = new String('Javascript'); Это создает объект-оболочка типа String. typeof str // string typeof obj // object

Таким образом, лучший способ проверить равенство - использовать оператор ===, потому что он проверяет значение, а также тип обоих операндов.

Если вы хотите проверить равенство между двумя объектами, то использование String.prototype.valueOf является правильным способом.

new String('javascript').valueOf() == new String('javascript').valueOf()
8
ответ дан Abhishek 21 August 2018 в 14:46
поделиться

Только одно дополнение к ответам: если все эти методы возвращают false, даже если строки кажутся равными, возможно, что есть пробел слева и справа от одной строки. Итак, просто положите .trim() в конец строк перед сравнением:

if(s1.trim() === s2.trim())
{
    // your code
}

Я потерял часы, пытаясь выяснить, что не так. Надеюсь, это поможет кому-то!

32
ответ дан akelec 21 August 2018 в 14:46
поделиться
  • 1
    Большое спасибо. Это странно для меня, потому что я убедился, что не было пробелов слева или справа, и все же это был единственный способ решить мою проблему. Может быть, это связано с внутренним представлением строки? – Niko 12 February 2018 в 08:41
  • 2
    Спасибо @akelec !! @Niko, вероятно, из-за характера Zero-Width-Space, невидимого невооруженным глазом. См. ru.wikipedia.org/wiki/Zero-width_space . Несмотря на то, что у этого персонажа есть свои цели, многие разработчики возмущаются его существованием! – stwr667 19 February 2018 в 13:41
  • 3

Если вы знаете, что это строки, тогда нет необходимости проверять тип.

"a" == "b"

Однако обратите внимание, что строковые объекты не будут равны.

new String("a") == new String("a")

будет возвращать false.

Вызвать метод valueOf (), чтобы преобразовать его в примитив для объектов String,

new String("a").valueOf() == new String("a").valueOf()

вернет true

155
ответ дан Anurag 21 August 2018 в 14:46
поделиться
  • 1
    спасибо за этот JSS, два строковых объекта никогда не будут равными, если они не являются одним и тем же объектом независимо от значения. – Anurag 27 August 2010 в 18:43
  • 2
    @JSS: Кроме того, new String("a") == "a" является истинным (но не будет с ===), потому что левая сторона будет преобразована в примитивное строковое значение. – Matthew Crumley 27 August 2010 в 19:27
  • 3
    @JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a") все возвращают false, так как вы имеете дело со ссылками на объекты класса String, а не на примитивы типа string. – palswim 27 August 2010 в 19:39
  • 4
    Просто прояснить это для тех, кто его читает. new String(foo) создает строку object , а String(foo) преобразует foo в примитив строки. – FakeRainBrigand 30 August 2013 в 17:31
  • 5
    @FakeRainBrigand - ясно, как грязь, но об этом говорят javascripts, не так ли? – Periata Breatta 30 September 2016 в 07:28

, что привело меня к этому вопросу, это padding и white-spaces

проверить мой случай

 if (title === "this word")
      doSomething();

, а название было " this word"

, поэтому, возможно, вам нужно использовать функцию trim, подобную этой

var title = $(this).text().trim();
8
ответ дан Basheer AL-MOMANI 21 August 2018 в 14:46
поделиться

always Пока вы не поймете различия и последствия использования операторов == и ===, используйте оператор ===, поскольку он избавит вас от неясных (неочевидных) ошибок и WTF. «Регулярный» == оператор может иметь очень неожиданные результаты из-за внутреннего принуждения типа, поэтому использование === всегда является рекомендуемым.

Для понимания этого и других «хороших против». плохие "части Javascript, прочитанные г-ном Дугласом Крокфордом и его работой. Есть отличный Google Tech Talk, где он суммирует много полезной информации: http://www.youtube.com/watch?v=hQVTIJBZook


Обновление:

Серия You Do not Know JS от Kyle Simpson превосходна (и доступна для чтения в Интернете). Серия входит в часто неправильно понятые области языка и объясняет «плохие части», которые Крокфорд предлагает вам избежать. Понимая их, вы можете правильно их использовать и избегать подводных камней.

В книгу « Up & amp; Going » входит раздел Equality , с этим конкретным резюме того, когда следует использовать свободные (==) против строгих (===) операторов:

Чтобы свернуть множество деталей до нескольких простых вылетов и помочь вы знаете, использовать ли == или === в разных ситуациях, вот мои простые правила:

  • Если любое значение (ака сторона) в сравнении может быть true или false, избегайте == и используйте ===.
  • Если любое значение в сравнении может быть из этих конкретных значений (0, "" или [] - пустой массив ), избегайте == и используйте ===.
  • В других случаях все вы можете использовать ==.

Я по-прежнему рекомендую говорить Крокфорда разработчикам, которые не хотят инвестировать время, чтобы действительно понять Javascript & mdash; это хороший совет для разработчика, который только изредка работает в Javascript.

478
ответ дан congusbongus 21 August 2018 в 14:46
поделиться
  • 1
    Это не обязательно, если вы уверены, что оба операнда являются строковыми, например, при использовании if (typeof foo == "string") – Marcel Korpel 27 August 2010 в 18:43
  • 2
    @Marcel - вы правы, но гораздо лучше always использовать оператор === и никогда не беспокоиться о том, «я действительно, полностью, на 100% уверен, что == будет вести себя так, как я думаю, что это будет? & quot; – STW 27 August 2010 в 18:44
  • 3
    @STW - один пример, почему Крокфорд не является альфой и омегой JavaScript, является его советом не использовать унарный приращение / декремент (++ / --). – Marcel Korpel 27 August 2010 в 20:28
  • 4
    И никогда не используйте операторы ++ или -- или одиночные строки if/else или continue или new или любое другое количество совершенно законных методов кода, которые Крокфорд считал «вредными». И, конечно, никогда даже не думайте об использовании eval или with, даже если их подводные камни хорошо понятны. И вы видели следующую версию JS? Более строгий синтаксис и несколько вспомогательных функций, некоторые из которых плавают в течение многих лет, - это все, что мы получаем после всего этого времени. Синтаксис вообще не развился. Если Крокфорд стоит за этим, то это было плохо. – MooGoo 27 August 2010 в 20:35
  • 5
    @CoffeeAddict - быстрый тест в JSFiddle, похоже, не согласен. Они чувствительны к регистру: jsfiddle.net/st2EU – STW 30 May 2013 в 19:35

String Objects можно проверить, используя этот хак JSON.stringyfy()

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);

1
ответ дан Usman 21 August 2018 в 14:46
поделиться

Если вы действительно не знаете, как работает принуждение, вы должны избегать == и вместо этого использовать оператор идентификации ===. Но вы должны прочитать это, чтобы понять, как это работает .

Если вы используете ==, вы даете языку какое-то принуждение типа для вас, например:

"1" == 1 // true
"0" == false // true
[] == false // true

Как сказал Дуглас Крокфорд в своей книге:

Всегда лучше использовать оператор тождества.

10
ответ дан zekel 21 August 2018 в 14:46
поделиться
  • 1
    Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Parkash Kumar 22 October 2015 в 10:42
  • 2
    – Basheer AL-MOMANI 11 October 2018 в 08:01
-4
ответ дан Khorram Bin Salim Khondkar 1 November 2018 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: