Проблема и js других слаботипизированных языков в том, что относительно простая операция обрастает десятками оговорок.
да здесь даже слабая типизация не при делах. NULL понятие прежде всего из СУБД, где первым делом объясняют что NULL IS NOT NULL и проблема не в типизации, а в понятии.
Эм. null или как аналог none это ничего. Особое значение обозначающее пустоту. То что в СУБД так же используют NULL для обозначения пустоты доказывает только то, что там есть пустые места. Никакого отношения к наследственности это не имеет.
потому что с точки зрения языка null ничем не отличим от none и в целом не редко реализуется по принципу define NULL 0
Хотя все же понятие NULL ближе по смысле к нулю, а к делению на ноль.
В остальных языках, которые вы знаете.
В той же джаве null == null является true совсем по другой причине: "==" там перегружен и в данном случае сравнивает не значения, а ссылки, которые, разумеется, в данном случае одинаковы.
Но в джаве вообще нет перегрузки операторов...
И ссылки он сравнивает только у объектов и не потому, что перегружен, а из-за того, что в переменной хранится то, что есть в стеке, а в стеке как раз хранится ссылка на объект в куче. У примитивных типов он сравнивает сами значения.
Нет пользовательской перегрузки, это не значит, что нет вообще. Простейший пример "+", который и суммирует, и строки конкатенирует. С "==" в данном случае аналогично.
Вторая часть комментария у вас интересная, конечно, но не соответствует действительности.
Что именно не соответствует? Хранение ссылок в стеке, хранение объектов в куче?
К тому же, оператор '+' не перегружен, компилятор Java преобразует его в StringBuilder с аппендами.
Та все же очень просто *SARCASM*. null <= 0. Тут применяется 2 операции: сравнение и проверка на больше/меньше. Со сравнением все понятно, а вот у "<" и ">" под капотом есть "я художник, я так вижу". Когда проверяем на больше/меньше - интерпритатор все не текстовые значения приводит к числу. Внутренний toNumber(null) возвращает ноль и на деле сравнение выглядит как 0 <= 0
@ nerd_mode = 1
На самом деле суть вышеописанной ситуации в простом, хотя и не очень продуманном алгоритме работы JS. Если мы обратимся к спецификации, что лежит по адресу https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.3 то увидим:
11.8.3 The Less-than-or-equal Operator ( <= )
The production RelationalExpression : RelationalExpression <= ShiftExpression is evaluated as follows:
Let lref be the result of evaluating RelationalExpression.
Let lval be GetValue(lref).
Let rref be the result of evaluating ShiftExpression.
Let rval be GetValue(rref).
Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false. (see 11.8.5).
If r is true or undefined, return false. Otherwise, return true.
Корень зла спрятался в r, коей принят результат от "<", который как мы знаем по логике JS'а, описанной в https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.1 будет false. Т.е. если Null < 0 false, то Null <= 0 полюбас true. Ведь так?
@ nerd_mode = 0
Сам факт того, что JS умеет сравнивать даже жопу с пальцем уже достоин уважения :peka: Просто логика сравнения жопы и пальца не укладывается в нашу с вами логику обывателя. У нас просто нет открытого третьего глаза и связи с подпространственными ктулху-наноботами, вращаюшими поршни мифического движка JS'а.
ЗЫ: могу ошибаться, но версия с неявным приведением мне все равно не нравится.
верно) null и undefined это особые значения, и лучше если не знаешь js на нормальном уровне к ним не прикасаться)
и к слову если использовать строгое сравнение
null <== 0 то будет false
да ладно вам, человек не может в приведение типов. Null приводит к NaN, а NaN как раз и отвечает этим условиям
сначала приводит к числу, потом к булен типу. Нан - это число меньше единицы, потому что значение, и больше нуля.
Так, хватит городить ещё большую хрень: NaN -- специальное числовое значение, которое возникает при неопределённых математических операциях. При числовом преобразовании к нему может быть приведен примитивный тип undefined, Null в таком случае приводится к нулю.
IT-юмор
5.7K пост52.5K подписчиков
Правила сообщества
Не публикуем посты:
1) с большим количеством мата
2) с просьбами о помощи
3) не относящиеся к IT-юмору