Можно ли проверить несколько строк, используя следующее?
if($("#clueOneInput").find('input[type=text]').val()=='dr1'||'dr')
Мой оригинал
if($("#clueOneInput").find('input[type=text]').val()=='dr1')
работает точно так, как ожидалось (желательно). Если ключ верен в соответствии с заданной строкой, продолжайте.
Проблема заключается в том, что я хочу включить изменения в случае опечатки. Это разрешено? Я парень PHP, поэтому я даже не уверен, что мое использование ||
верно. У кого-нибудь есть понимание?
Вы можете делать то, что вы хотите, но или оператор (||
) не работает так. Я бы сохранил значение в переменной, а затем проверил несколько опций. просто набрав, например,
var x = $("#clueOneInput").find('input[type=text]').val();
if(x == 'dr1' || x == 'dr')
{
//do something
}
РЕДАКТИРОВАТЬ
То, что здесь происходит, является следствием приоритета оператора и типа принуждения. Параметр .val()
проверяется сначала на 'dr1'
. ==
имеет более высокий приоритет, чем OR ||
поэтому сравнение выполняется ==
, перед OR ||
, Теперь это приведет к логическому, истинному или ложному, тогда OR ||
будет работать, так что вы закончите кратко или false || 'dr'
false || 'dr'
или true || 'dr'
true || 'dr'
внутри оператора if, которые оба разрешают true, как показано ниже
Расширение объяснения ||
||
является логическим оператором OR, это один из условных операторов (вместе с && и!) в javascript. При использовании с булевыми выражениями (например, x == 'dr1'
т.е. разрешается прямо к true или false) ||
может быть буквально прочитан как OR, поэтому в моем коде выше он будет читать "если x равно" dp1 "или x равно" dr ". При использовании с выражениями, которые не являются непосредственно булевыми значениями, они будут принуждаться к правдивости или ложности. Если я временно игнорирую инструкцию if из вашего исходного кода (только для этого примера) и беру только логическое выражение OR ('dr1'||'dr'
), которое не имеет логических выражений, но напрямую использует строки, оно фактически разрешает к первому значению ('dr1'). Зачем? При использовании между двумя строками. ||
возвращает первое значение, которое разрешает true (хорошо правдиво). В js любая строка, отличная от пустой строки, верна. Некоторые примеры
var test1 = "Foo" || "Bar"; // test1 is "Foo"
var test2 = "" || "Bar"; // test2 is "Bar"
var test3 = "" || "" || "Bar"; // test3 is "Bar"
var test4 = "" || "Foo" || "Bar"; // test4 is "Foo"
var test5 = false || "Foo" || "Bar";// test5 is "Foo"
Таким образом, результат выражения 'dr1'||'dr'
всегда будет возвращать 'dr1'
.
ПРИМЕЧАНИЕ. Оператор присваивания =
имеет более низкий приоритет, чем оператор OR ||
поэтому OR ||
выполняется сначала, а затем присваивание =
. Это отличается от оператора сравнения ==
который выполняется сначала перед OR ||
Значения, о которых вы должны опасаться, являются ложными (т.е. Разрешение на ложь), равны null, 0, NaN, пустая строка ("") или неопределенные. Все остальное является правдивым, которое включает (но не ограничиваясь) положительные и отрицательные числа (поэтому -1 разрешает true) и любую строку (включая "false")
Теперь в вашем конкретном случае оператор if
всегда проверяет логическое выражение, если выражение не является логическим, оно будет принудительно введено в логическое, поэтому ваши два результата были false || 'dr'
false || 'dr'
или true || 'dr'
true || 'dr'
который решил "dr" и true соответственно. Теперь "dr" не является пустой строкой, поэтому разрешает true с помощью оператора if
, и, конечно, true является истинным, поэтому почему ваш оператор if
всегда разрешен для true.
Логический оператор И &&
ведет себя аналогичным образом, но я оставляю это на другой день.
Дополнительная заметка я нахожу ее (||
) весьма удобной при определении функций, которые имеют параметры по умолчанию, например
function awesomeFunction(inputParam)
{
inputParam = inputParam|| "Default Value"
//more code .. using inputVar
}
То, что это делает, - это если функция вызвана, предоставляя входной параметр, например
awesomeFunction("Input Value");
то значение inputParam
внутри функции будет "Input Value". Если он не вызывается с любыми входными параметрами, например
awesomeFunction();
то значение inputParam
внутри функции будет "Default Value"
. Причина в том, что inputParam
внутри функции для второго вызова будет undefined
. Это, как мы знаем, разрешает ложь (ложь), поэтому выражение inputParam || "Default Value"
inputParam || "Default Value"
решит "Default Value"
во всяком случае, я думаю, что я, возможно, увлекся, но я надеюсь, что это поможет
Ссылка FYI
Разработчик и разработчики Mozilla Javascript
В частности, разделы приоритетов логических операторов и операторов
Вы должны повторить оператор сравнения по каждому параметру ||
, Это проще всего сделать, установив переменную:
var theVal = $("#clueOneInput").find('input[type=text]').val();
if (theVal == 'dr1' || theVal == 'dr')
Что здесь происходит, так это то, что ваше решение всегда оценивает истину. Вы видите, что с этим фрагментом кода, поскольку вы не используете оператор сравнения по обоим значениям, вы в основном говорите false или true, и в этом случае всегда будет true, если левая сторона равна false, поскольку || == 'dr'
|| == 'dr'
всегда верно.
if($("#clueOneInput").find('input[type=text]').val()=='dr1'||'dr')
if(false || true)
if(true || true);
Оба они всегда будут правдой.
Вам нужно сделать это:
if($("#clueOneInput").find('input[type=text]').val()=='dr1' || $("#clueOneInput").find('input[type=text]').val() == 'dr')
Лучший способ - сохранить ваш элемент в переменной, если вы будете использовать его более одного раза. Это легче читать, и вы получите некоторую производительность. Ommiting.val() - это умная вещь, поэтому вы можете использовать элемент для большего количества процедур! jQuery.find() - дорогостоящая функция, поэтому рекомендуется абстрагировать результат для максимального повторного использования. Добавление.val() делает вашу переменную менее многоразовой.
var el = $("#clueOneInput").find('input[type=text]');
if(el.val() == 'dr1'|| el.val() == 'dr')
Попробуйте использовать несколько селекторов атрибутов и объедините их с запятой, которая найдет dr1 или dr:
if($("#clueOneInput")
.find('input[type="text"][value="dr1"],input[type="text"][value="dr"])
if (something || 'dr')
. Поскольку «dr» является «правдивым», первый блокif
всегда запускается.