17
но ведь 20
Дети как обычно минусуют, Мои скромные +0,1 от Javascript разработчика.
А в С/С++ было бы '2'.
Я одинарные кавычки для кого оставил?
чтоб сложить придется кастить в число. если ты не делаешь руками каст назад то в результате будет число. обратно в символ оно волшебным образом не превратится, но если с натяжкой, то будем считать что и '2' корректно.
Примени оптимизацию к выражению и ты поймёшь, почему я написал именно '2'. Хороший компилятор проигнорирует '2' - '2', а следовательно оставит '2'.
Остальное - вопрос интерпретации.
Остальное - вопрос интерпретации.
Объясни как считал?
Из чётных чисел путём сложения, вычитания и умножения невозможно получить нечётное число.
Из чётных чисел путём сложения, вычитания и умножения невозможно получить нечётное число.
Всё просто:
Шел 2019 год...
мне даже стало интересно, 2 записан в виде текста, если сложить 2 текста то будет 22, а если вычесть 2(текст)? то вычтет все 2йки или только одни или вообще пошлет нахрен?
Оператор "плюс" не кастит строки к числам, потому складывает как строки. Получается 22.
Оператор "минус" кастит строки к числам, потому сначала он из результата сделает числа, а потом - отнимет. Получится 22-2=20
Оператор "минус" кастит строки к числам, потому сначала он из результата сделает числа, а потом - отнимет. Получится 22-2=20
Но...почему???? Почему плюс и минус не ведут себя одинаково?
'22' - '1'. Жду ответа.
21
We need to go deeper. 'a' - 'b'?
-1
NaN
Ответ - не делать сложение строк плюсом/не делать ничего минусом.
А вообще 21
А вообще 21
Лол, не делать сложение строк плюсом. Только не говори это вслух, за такое и убить могут
Да вообще похуй.
Потому что складывать можно и строки и числа, а вычитать только числа, в логике языка
потому что если один из операндов оператора "+" явл. строкой, то второй тоже преобразуется в строку и выполняется конкатенация.
поэтому нужно писать так:
+'2' + +'2' - '2'
+'2' + +'2' - '2'
Убрать кавычки религия запрещает?
если пользователь что-то вводит на страничке, то возвращается строка, строка Карл.
например, prompt(), поля и прочие способы взаимодействия с пользователем возвращают строку.
Явный унарный "+" приводит эту строку к числу.
например, prompt(), поля и прочие способы взаимодействия с пользователем возвращают строку.
Явный унарный "+" приводит эту строку к числу.
Потому что гугли "Приоритет операторов javascript" и "Перегрузка операторов"
Воспринимают код как арифметические выражения, не читают документацию по языку, а потому ноют, какой же он плохой.
Воспринимают код как арифметические выражения, не читают документацию по языку, а потому ноют, какой же он плохой.
Причем тут документация? Если бы тебе запилили язык, где все операторы - иероглифы, ты бы тоже в документацию тыкал?
КуМир без установленной кириллицы.
Да одинаково. Например 'N'+'a'-'N' даст в результате NaN
JS он как поехавший среди языков.
20 же, не?
Автор глупый какой-то. При чём тут "простые математические действия"? Это особенности приведения типов. К математике в JS они не имеют отношения, которая вполне стандартна и пользуется тем же стандартом, что и все другие языки.
Кто вообще будет отнимать две строки?
Кто вообще будет отнимать две строки?
А почему тогда программа не падает если кто-то вычитает две строки? Python примерно так и поступает.
Потому что Java верит в тебя и глубокий смысл происходящего
Нет, джава как и другие нормальные языки, так не делает
Потому что срабатывает приведение типов
Потому что JS изначально задумывался как скриптовый язык для всяких свисто-перделок на интернет-страничках с минимальным порогом вхождения для того времени. Основной функционал страницы должен был обеспечиваться HTML'ем и CSS'ом. Оттого и проглатывание ошибок. Ну не завелся скрипт с падающими снежинками под Новый год, главное сайт магаза работает, потому что сделан на статичных страницах и формах.
К тому моменту, как народ начал пилить на JS более продвинутый функционал, язык уже был стандартизирован. А это означает, что при всем желании внести правки, нарушающие обратную совместимость языка, крайне затруднительно.
К тому моменту, как народ начал пилить на JS более продвинутый функционал, язык уже был стандартизирован. А это означает, что при всем желании внести правки, нарушающие обратную совместимость языка, крайне затруднительно.
IEEE 754
Таки это стандартный гемор двоичных вычислений
Зависит от применяемого стандарта. Если использовать числа с фиксированной точкой, то таких проблем не бывает.
0.0001 + 0.0002 === 0.00030000000000000003
Но js все равно не может в простые арифметические операции. Просто нужно было другой пример привести
Например, 0.1+0.2
Например, 0.1+0.2
Зато для инженерной операции, которой является рисование пикселей на мониторе, такая точность вполне допустима. А ускорение, которое даёт такой подход, бесценно.
Ваши примеры не примеры, за точностью лезьте в NumPy
Ваши примеры не примеры, за точностью лезьте в NumPy
Почти все языки так себя ведут :) Особенность устройства double.
Не почти все, а вообще все. Ибо стандарт. Только надстройки для точных вычислений решают эту проблему.
Лично я впервые с таким поведением столкнулся именно в JS и был крайне на него зол из-за этого. Понимание того настколько глубока кроличья нора пришло позже. А все почему? А потому что в строгих языках для конвертации double в строку будь любезен использовать функции наподобии sprintf, которая прячет часть проблем. Коменты выше с притензиями к точности явно показывают что я в этом плане совсем не уникален и должно пройти время пока прийдет осознание.
Из-за floating point хейтят или все же из-за других приколов? Те же, кто хейтят JS из-за IEEE 754, не заслуживают писать на чем-либо JS.
Практически весь доеб до JS строится на примерах, которые в реальной разработке не случаются.
Больше 10 лет прогаю в том числе на JS. Самый запоминающийся случай, когда я отхватил проблем выглядел примерно так:
function(){
return
42;
}
Такая функция возвращает undefined, а не 42, как предполагалось. Если написать так:
function(){
return 42;
}
то все работает нормально.
Больше 10 лет прогаю в том числе на JS. Самый запоминающийся случай, когда я отхватил проблем выглядел примерно так:
function(){
return
42;
}
Такая функция возвращает undefined, а не 42, как предполагалось. Если написать так:
function(){
return 42;
}
то все работает нормально.
Оптимизация исполнения. Раз return значит return, а что дальше - фиолетово. Это косяк интерпретатора.
Сейчас такой пример работает?
Сейчас такой пример работает?
Уже проверил. Исправно не работает.
Это не косяк. Такое поведение задокументировано в спецификации (см. раздел Automatic Semicolon Insertion). Он связано с грамматикой языка, а именно с возможностью не завершать statement специальным символом ";", как этого требует например Си.
Python 2.7 ведет себя таким же образом.
Python 2.7 ведет себя таким же образом.
Питон же завершает переносом строки как в Бейсике. Или я что-то не знаю?...
Результат:
func1 = None
func2 = 777
func3 = 34
func1 = None
func2 = 777
func3 = 34
Практически весь доеб строится на динамической нестрогой типизации. Которая, может, и имеет преимущества для хуяк-хуяк-и-в-продакшн-драйвен-девелопмент, но большом проекте приводит к боли. Потому что у тебя краши в рантайме, а не на этапе компиляции, из-за того, что где-то ты как-то объебался, и пришло не то, что ожидалось, что какого-то поля нет и у тебя undefined, а может ты вообще добавил поле, которого быть не должно. Ну и не только JS, я как-то также плевался, отлаживая руби. Но у жс она максимально всрато нестрогая.
Помимо этого можно добавить такие охуительные вещи, как прототипное наследование. Сука, совсем недавно в язык завезли что-то, хоть более-менее похожее на нормальный ООП. Ну, может там есть еще вагон каких-то приколов, я хз, на жс, к счастью, не пишу.
Помимо этого можно добавить такие охуительные вещи, как прототипное наследование. Сука, совсем недавно в язык завезли что-то, хоть более-менее похожее на нормальный ООП. Ну, может там есть еще вагон каких-то приколов, я хз, на жс, к счастью, не пишу.
А я пишу. И довольно много и давно. Чувствую себя нормально.
Я говорю о том, что чистый JS предназначен для хуяк-хуяк-скриптик-снежинки (ну или для тех, кто уверен в своих силах и знаниях по JS). А если кто-то делает большой проект на чистом JS и терпит боль от динамической типизации, то это его головняк. Это как если писать десктопное приложение или серверную логику на ассемблере или на чистом Си и предъявлять им в вину пулеметную стрельбу по ногам. Для каждой задачи свой инструмент. Мне могут возразить, дескать, браузеры могут только в JS. На что я отвечу, уже давно есть трансляторы вроде TypeScript, в которых и статическая типизация, и ООП.
Я говорю о том, что чистый JS предназначен для хуяк-хуяк-скриптик-снежинки (ну или для тех, кто уверен в своих силах и знаниях по JS). А если кто-то делает большой проект на чистом JS и терпит боль от динамической типизации, то это его головняк. Это как если писать десктопное приложение или серверную логику на ассемблере или на чистом Си и предъявлять им в вину пулеметную стрельбу по ногам. Для каждой задачи свой инструмент. Мне могут возразить, дескать, браузеры могут только в JS. На что я отвечу, уже давно есть трансляторы вроде TypeScript, в которых и статическая типизация, и ООП.
Ну, так, TypeScript - не JS, же, да? Это же другой язык, пусть и транслируется в JS. И тот же Kotlin, вроде, можно в JS даже транслировать. Про тайпскрипт я особо претензий не видел.
Я говорю о том, что нехуй на JS гнать за то, что в нем нет того, чего в нем быть не должно.
Люди пытаются писать большие, сложные проекты. В качестве языка разработки выбирают голый JS. Стреляют себе по ногам из пистолета системы "динамическая нестрогая типизация". Но при этом претензии предъявляют к языку. Не к архитектору или там к руководителю разработки, который выбрал не тот инструмент, а к языку! А давайте десктопные приложения на асме писать будем. А когда эти приложения будут падать из-за ошибок при работе с памятью, будем говорить: "Чего ж ты ассемблер такой небезопасный и вообще в классы не умеешь?!"
Люди пытаются писать большие, сложные проекты. В качестве языка разработки выбирают голый JS. Стреляют себе по ногам из пистолета системы "динамическая нестрогая типизация". Но при этом претензии предъявляют к языку. Не к архитектору или там к руководителю разработки, который выбрал не тот инструмент, а к языку! А давайте десктопные приложения на асме писать будем. А когда эти приложения будут падать из-за ошибок при работе с памятью, будем говорить: "Чего ж ты ассемблер такой небезопасный и вообще в классы не умеешь?!"
Если в каком-то языке есть приведение типов, то лучше-бы тебе сука их изучить перед написанием кода.
Читер
казалось бы сделай ты разные операторы для конкатенации и сложения, но нет блядь, давай, сука, решай ебучие ребусы...
Используй PHP с AJAX. В PHP конкатенация точкой.
та то понятно, но мне теперь блджад каждую операцию на сервер отправлять что ли?
Да. Много ли операций JS производит?
немало, в среднем проекте где аналитика и результаты перепросчитываются налету это боль в жопе каждый раз отсылать и ловить
Для сложения строк лучше использовать конструкцию для форматирования:
var str1 = 'Hello';
var str2 = 'Vasya';
var result = `${str1}, ${str2}!` // result: Hello, Vasya!
var str1 = 'Hello';
var str2 = 'Vasya';
var result = `${str1}, ${str2}!` // result: Hello, Vasya!
Налету - значит и AJAX уже при делах.
Казалось бы, сделай строгую типизацию и перегрузку операторов, как в C#/C++/итп.
С NaN что ни делай - всё NaN.
До слез, спасибо
Было бы 'NaN', а не NaN, я бы тоже завис.
Чтобы написать коммент, необходимо залогиниться
Отличный комментарий!