Мы не можем привязать это к setTimeout()
, поскольку он всегда выполняется с глобальным объектом (Window), если вы хотите получить доступ к контексту this
в функции обратного вызова, а затем с помощью bind()
к функции обратного вызова, которую мы можем достичь как:
setTimeout(function(){
this.methodName();
}.bind(this), 2000);
На самом деле существует два способа, с помощью которых строки могут быть созданы в 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()
Только одно дополнение к ответам: если все эти методы возвращают false, даже если строки кажутся равными, возможно, что есть пробел слева и справа от одной строки. Итак, просто положите .trim()
в конец строк перед сравнением:
if(s1.trim() === s2.trim())
{
// your code
}
Я потерял часы, пытаясь выяснить, что не так. Надеюсь, это поможет кому-то!
Если вы знаете, что это строки, тогда нет необходимости проверять тип.
"a" == "b"
Однако обратите внимание, что строковые объекты не будут равны.
new String("a") == new String("a")
будет возвращать false.
Вызвать метод valueOf (), чтобы преобразовать его в примитив для объектов String,
new String("a").valueOf() == new String("a").valueOf()
вернет true
new String("a") == "a"
является истинным (но не будет с ===
), потому что левая сторона будет преобразована в примитивное строковое значение.
– Matthew Crumley
27 August 2010 в 19:27
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
new String(foo)
создает строку object i>, а String(foo)
преобразует i> foo в примитив строки.
– FakeRainBrigand
30 August 2013 в 17:31
, что привело меня к этому вопросу, это padding
и white-spaces
проверить мой случай
if (title === "this word")
doSomething();
, а название было " this word"
, поэтому, возможно, вам нужно использовать функцию
trim
, подобную этойvar title = $(this).text().trim();
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.
if (typeof foo == "string")
– Marcel Korpel
27 August 2010 в 18:43
===
и никогда не беспокоиться о том, «я действительно, полностью, на 100% уверен, что ==
будет вести себя так, как я думаю, что это будет? & quot;
– STW
27 August 2010 в 18:44
++
/ --
).
– Marcel Korpel
27 August 2010 в 20:28
++
или --
или одиночные строки if/else
или continue
или new
или любое другое количество совершенно законных методов кода, которые Крокфорд считал «вредными». И, конечно, никогда > даже не думайте об использовании eval
или with
, даже если их подводные камни хорошо понятны. И вы видели следующую версию JS? Более строгий синтаксис и несколько вспомогательных функций, некоторые из которых плавают в течение многих лет, - это все, что мы получаем после всего этого времени. Синтаксис вообще не развился. Если Крокфорд стоит за этим, то это было плохо.
– MooGoo
27 August 2010 в 20: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" == 1 // true
"0" == false // true
[] == false // true
Как сказал Дуглас Крокфорд в своей книге:
Всегда лучше использовать оператор тождества.