-
Notifications
You must be signed in to change notification settings - Fork 90
Добавить описание сравнения с null
при помощи ==
#49
Comments
null
при помощи ==
null
при помощи ==
В целом, да. Можно сделать замечание. Но часто ли вообще нужно сравнение и с |
Зачем? Тянуть в код либу (конечно, она может уже и есть в code base) только ради проверки на
Именно поэтому лучше всегда использовать
Как показывает практика, это происходит крайне часто. Даже в проекте на TypeScript, где все довольно хорошо типизированно, буквально на прошлой неделе видел баг, связанный с выводом строки А вот случай, где наоборот нужно было бы отдельно сравнивать с |
Дело не в либе. А в том, чтобы делать сравнение сразу с
Я как раз про случай, когда в коде есть проверки только на
У меня опыт несколько не такой. Строгих и не строгих проверок на С Реактом еще нюанс в том, что |
Все верно, но это же уже не про сравнение. В случае с реактом и default arguments, это самое попадание в дефолтное поведение уже выступает в качестве одной из внутренних проверок. Но мы же никогда (возможно, есть редкие случаи) не хотим работать с null и undefined, и самый частый кейс именно сравнения c Даже с учетом дефолтного поведения пропсов/аргументов, не вижу причин не использовать двойное равно. Что мы потеряем, если будем его использовать вместо тройного равно при сравнении с |
Это произошло потому что типы(спецификации) динамических данных не проверяли в динамике - не знаю кто вдруг решил что статические типы отменяют динамическую проверку. Статика это просто про то что можно проверить динамически в одном месте(месте получения данных) а дальше уже положится на стат анализ. Плюс есть то что в статике не проверишь - кастомные свойства. Чтобы нормально проверять типы в динамике тебе всеравно нужна либа(это к вопросу про тянуть либу) - типа tcomb, runtypes etc Вообщем проверка на нулл это просто частный случай проверки соответствия данных некоторой спецификации - а для этого тебе точно нужна библиотека. |
Никто этого не решал. Так же как и типы не отменяют тесты, но суть разговора не в этом. Суть в том, что не нужно переусложнять то, что можно сделать просто. В подавляющем большинстве случаев проверка на
Для проверки на |
Ок вернемся к примеру.
Здесь версия молча округлится до 2. Это очень не очень. Проверка на "не значения" зачастую это просто костыль, чтоб все хотя бы не падало в рантайме, которым маскируют места в которых "никто не знает что происходит и непонятно что здесь за данные могут прийти". То есть вместо того чтоб разбираться почему это вдруг пришло "не значение" вместо значения и разобраться какое должно быть поведение, просто добавляют проверку. Хотя бы потому что если ты знаешь спецификации своих данных то скорее всего ты знаешь где у тебя может быть нулл а где андефайнед. Вообщем типичное для программирования лечение симптомов вместо причин.
Речь как раз про то что если все проверки спецификаций данных ограничиваются проверкой на нулл - то чтото пошло не так. Если данные проверяются - то либа с вероятностью 99% уже подключена. Ну а про семантическую разницу Саша неплохо сказал уже. |
@typeetfunc мне кажется, мы начинам сильно уходить в сторону.
Никто здесь не говорит, что все нужно проверить проверкой на
Согласен, что семантическая разница определенно есть, с этим то никто и не спорит, но из-за этого сравнивать отдельно с null и отдельно с undefined некую сущность чтобы убедиться, что она является валидным значением - излишнее переусложнение на ровном месте Допустим, у нас есть некоторые данные: const user = {
bio: {
name: 'Vasya',
},
} У объекта Да, наверное, @typeetfunc ты скажешь, что нужно проверять является ли /* Правильно */
if (a === b) {
...
} Тогда тоже некорректно, потому что:
Тройное равно точно так же никак не проверят спецификацию, а следовательно вопрос проверки спецификации стоит вообще вынести за рамки данного обсуждения P.S. |
const user = {
bio: {
name: 'Vasya',
},
} то есть цель таки вывести имя? для этого нужны две вещи:
написание чего то типа Я согласен что речь вообще не про это. Но ты завел речь про то что проверка на пустоту это частый кейс и ее очень много в коде. И изза этого надо иметь возможно записывать эту проверку кратко при помощи двойного равно. Я считаю что таком случае надо разобраться - а везде ли эти проверки семантически корректны или гдето это просто костыль потому что мы за данными не уследили? Там где они корректны их надо абстрагировать используя path и/или Optional(для 90% проектов хватит path). Там где где они не корректны с точки зрения семантики надо начать нормально проверять данные. Я понимаю что мои советы для продакшена не применимы. Но речь не о продакшене же, а о обучении. Нельзя учить тому что если у вас есть куча странного кода в бизнесс логике который к ней не относится но почему то там есть - то просто придумайте способ записать его покороче. Дело не в этих проверках, а в принципе. |
Тогда давайте напишем в правилах сравнения: /* недопустимо */
if (a == b) {
...
}
/* недопустимо */
if (a === b) {
...
}
/* правильно */
if (R.equals(a, b)) {
...
}
Мне кажется, мы ушли вообще не туда. Изначально issue про то, что не нужно всегда сравнивать при помощи |
Если нам нужно проверять переменную на
null
илиundefined
, то лучше использовать двойное равно==
, так как одним сравнением мы убиваем двух зайцевПравить тут https://github.com/CSSSR/sputnik/blob/master/docs/JavaScript/Readme.md
Это нормально, так как:
The text was updated successfully, but these errors were encountered: