селекторы jQuery: логичный ИЛИ

Существует два основных способа преобразования строки в число в javascript. Один из способов - проанализировать его, а другой способ - изменить его тип на число. Все трюки в других ответах (например, унарный плюс) подразумевают неявное принуждение типа строки к числу. Вы также можете сделать то же самое с помощью функции Number.

Парсинг

var parsed = parseInt("97", 10);

parseInt и parseFloat - это две функции, используемые для разбора строк на числа. Синтаксический анализ остановится молча, если он попадет в символ, который он не распознает, что может быть полезно для синтаксического анализа строк, например «92px», но это также несколько опасно, поскольку оно не даст вам никакой ошибки при плохом вводе, вместо этого вы 'вернем NaN, если строка не начинается с числа. Пробел в начале строки игнорируется. Вот пример того, как он делает что-то другое в соответствии с тем, что вы хотите, и не указывая на то, что что-то пошло не так:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

Хорошая практика всегда указывать в качестве второго аргумента radix. В старых браузерах, если строка начиналась с 0, она была бы интерпретирована как восьмеричная, если бы не было указано значение radix, которое привлекло много людей врасплох. Поведение для шестнадцатеричного запуска запускается, если строка начинается с 0x, если не указано значение radix. 0xff. Стандарт фактически изменился с помощью ecmascript 5, поэтому современные браузеры больше не запускают восьмеричные, когда есть ведущее 0, если не указано никаких оснований. parseInt понимает радики до основания 36, и в этом случае буквы верхнего и нижнего регистра рассматриваются как эквивалентные.

Изменение типа строки на число

Все остальные трюки упомянутые выше, которые не используют parseInt, включают неявное принуждение строки к числу. Я предпочитаю делать это явно,

var cast = Number("97");

Это имеет другое поведение для методов анализа (хотя оно по-прежнему игнорирует пробелы). Это более строго: если он не понимает всю строку, чем возвращает NaN, вы не можете использовать ее для строк, таких как 97px. Поскольку вы хотите примитивное число, а не объект обертки Number, убедитесь, что вы не помещаете new перед функцией Number.

Очевидно, что преобразование в число дает вам значение, которое может быть float, а не целое число, поэтому, если вам нужно целое число, вам нужно его изменить. Есть несколько способов сделать это:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

Любой побитовый оператор (здесь я сделал поразрядный или, но вы также можете сделать двойное отрицание, как в более раннем ответе или бит-сдвиге) преобразует значение для 32-битного целого числа, и большинство из них преобразуется в целое число со знаком. Обратите внимание, что это не будет делать желаемого для больших целых чисел. Если целое число не может быть представлено в 32 битах, оно будет завершено.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Чтобы правильно работать с большими числами, вы должны использовать методы округления

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

. Помните, что все эти методы понимают экспоненциальную нотацию, поэтому 2e2 200, а не NaN. Кроме того, Number понимает «Бесконечность», в то время как методы анализа не делают.

Пользовательский

Маловероятно, чтобы любой из этих методов выполнял именно то, что вы хотите. Например, обычно мне нужна ошибка, возникающая при сбое синтаксического анализа, и мне не нужна поддержка Infinity, экспоненты или ведущие пробелы. В зависимости от вашего использования, иногда имеет смысл написать пользовательскую функцию преобразования.

Всегда проверяйте, что вывод Number или один из методов анализа - это число, которое вы ожидаете. Вы почти наверняка захотите использовать isNaN, чтобы убедиться, что число не NaN (обычно это единственный способ узнать, что синтаксический анализ не удалось).

27
задан mjv 7 March 2010 в 04:40
поделиться

6 ответов

Что насчет: $some_elements.eq(0).nextUntil('.headsection, .subtitle');

Работает, по крайней мере у меня. Читайте о множественных селекторах.

29
ответ дан 28 November 2019 в 04:09
поделиться

Это так же, как в селекторах CSS:

$('.headsection, .subtitle');
52
ответ дан BlackAura 20 November 2019 в 04:20
поделиться

Будет ли работать мультиселектор для того, что вы делаете? Api Doc здесь.

3
ответ дан Eric 20 November 2019 в 04:20
поделиться

jQuery использует синтаксис селекторов CSS, так что если вы знаете его, просто подставьте те же селекторы в jQuery, и Боб - ваш метафорический дядя. jQuery использует sizzle селекторный движок, который поддерживает практически все селекторы CSS3 :)

Как уже все сказали - делать это нужно так: $content = $some_elements.eq(0).nextUntil('.headsection, subtitle');

4
ответ дан 28 November 2019 в 04:09
поделиться

Вам действительно не нужно логическое ИЛИ как таковое, $ ('. Headsection, .subtitle') должен делать свою работу.

5
ответ дан 28 November 2019 в 04:09
поделиться

Просто разделите их запятой:

$content = $some_elements.eq(0).nextUntil('.headsection, subtitle');
5
ответ дан 28 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

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