Что делает if(!el.val())?
Собственно вопрос в заголовке.
Выполнение вычисления типа !el.val() вернет true если длина строки == 0 и вернет false, если length > 0
Но вопрос именно в том, как jquery это преобразует в длину строки?
Ответы (3 шт):
jQuery никак не преобразует это в длину строки.
Метод .val возвращает просто строку.
Дальше работает оператор логического отрицания(!)
Данный оператор применяет к операнду абстрактный метод ToBoolean, и инвертирует результат.
Как можно заметить из таблицы, для строк результат ToBoolean → false, если аргументом передается строка нулевой длины, после инвертирования получаем true.
Проверка идёт не на длину строки, а на то, пустая строка или нет (хотя по сути это одно и то же, но всё-таки).
При булевых операциях у JS есть определённые правила, по которым пустая строка считается false, а не пустая true.
Выражение !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 в противном случае.