Что делает if(!el.val())?

Собственно вопрос в заголовке.

Выполнение вычисления типа !el.val() вернет true если длина строки == 0 и вернет false, если length > 0

Но вопрос именно в том, как jquery это преобразует в длину строки?


Ответы (3 шт):

Автор решения: Grundy

jQuery никак не преобразует это в длину строки.

Метод .val возвращает просто строку.

Дальше работает оператор логического отрицания(!)

Данный оператор применяет к операнду абстрактный метод ToBoolean, и инвертирует результат.

Как можно заметить из таблицы, для строк результат ToBooleanfalse, если аргументом передается строка нулевой длины, после инвертирования получаем true.

→ Ссылка
Автор решения: CrazyElf

Проверка идёт не на длину строки, а на то, пустая строка или нет (хотя по сути это одно и то же, но всё-таки). При булевых операциях у JS есть определённые правила, по которым пустая строка считается false, а не пустая true.

→ Ссылка
Автор решения: NoSkill

Выражение !el.val() эквивалентно !(el.val()). Сначала выполнится el.val(), что вернет строку судя по документации JQuery. Таким образом останется следующее выражение:

!expr

Оператор ! - это логический оператор отрицания. А expr - в нашем случае строка (String).

Для выполнения логического оператора !, его expr должен булевого типа. Тогда по спецификации JS должен попытаться автоматически переконвертировать строковый expr в Boolean для последующего выполнения оператора !:

The ECMAScript language implicitly performs automatic type conversion as needed. https://tc39.es/ecma262/#sec-type-conversion

Теперь обратимся к документации JS, как именно String конвертируется в Boolean:

If argument is the empty String (its length is zero), return false; otherwise return true. https://tc39.es/ecma262/#sec-toboolean

Мы видим, что, если String имеет нулевую длину, то он конвертируется в false; в противном случае в true.

После конвертации у нас остается все то же выражение:

!expr

Однако expr - это уже Boolean, в который переконвертирована наша строка.

В итоге: выражение !expr будет true если строка имела нулевую длину, и false в противном случае.

→ Ссылка