Эм. А что это за еретическая лексика, в которой string и integer можно так складывать? Или оно само на лету преобразует 1+'1' в 1+StrToInt('1')?
Пусть result=1+'1'
Будет ли разным значение result, если он изначально объявлен как string и если он изначально объявлен как integer?
С точки зрения интерпретатор JS у всех значений есть типы, просто они скрыты от программиста. Когда вызывается операция, требующая определённых типов, то значения неявно приводятся к этим типам. К сожалению полные правила определения какие типы нужны и приведения к этим типам в JS представляют из себя огромные простыни сложных условий, которые фиг найдёшь в интернете, и никто никогда их не помнит, за исключением нескольких отдельных частовстречающихся сценариев, к которым, в том числе, относится сложение и вычитание строк с числами.
Можешь все-таки в двух словах объяснить зачем такие сложности? Все эти неявные фичи, скрытые от программиста, нужны для того, чтобы облегчить сам код, сделать его проще и снизить порог вхождения или есть какой-то глубокий функциональный смысл в этом?
Изначальный смысл - снизить порог вхождения. Типа "не будем грузить людей типами, JS сам разберётся что вы хотели написать". Но любая попытка разрабатывать на JS что-нибудь действительно сложное мгновенно аукается необходимостью самостоятельно отслеживать типы (и не только их), резко задирая планку сложности разработки стабильного и легко обслуживаемого кода.
изначальный смысл - сделать предельный минимум критичных ошибок. потому в JS можно и на ноль делить, обращаться к несуществующим свойствам объектов, в ветках условий обращаться к несуществующим переменным и т.п.
если бы скрипты JS работали как программы на других языках - у нас бы постоянно валились сайты, не работала анимация и аякс из-за кривых баннеров или адблоков. а так - ну, не сработал кусок кода как нужно из-за неполученных данных - и хуй с ним, выполняемся дальше, не критично: пользователь информацию прочитать может, в БД ничего не пишется, при перезагрузке страницы скорей всего будет ок.
Да. Проверка типов динамическая, в переменной около значения должна храниться какая-то информация о типе.
Хотя, в случаях, когда переменная не меняет свой тип, компилятор может выкинуть и эту информацию, и проверки. В таких случаях говорят, что на современных движках JS в некоторых случаях работает со скоростью C.
Блин, точно! Я видел этот видос. На хабре его постили, по-моему. Смешно, конечно, но кто-то может объяснить ЗАЧЕМ это так сделано в JS? Плюсы какие-то в этом есть? Типа, переменные можно не объявлять. Ну ок. И всё?
В MVS вон тоже можно взять и настроить какой-нибудь Fortran90, что все переменные, которые не объявлены будут real, а все, которые начинаются с "i' и "j" - integer. Удобно, ровно до того момента, как тебе не придётся всё это портировать на другую платформу/компилятор/язык.
у меня ответа нет.
во временя скрипткидствования меня жутко радовало, что можно от строки отнимать или прибавлять числа и при наличии в ней цифр учитывались только они. но сейчас.. блять
иногда бывает хуй угадаешь где балабака зарыта
Я пишу иногда скрипты на одной херне, у неё даже названия нет. Это какая-то такая смесь дельфей и матлабовского языка. Может, и от JS там что-то есть. но я JS не знаю, так что мне трудно понять.
Так вот, там тоже переменные можно вообще не объявлять, но (почти) всегда понятно какого типа переменная у тебя получилась: что в неё первое записалось, такого типа она и будет.
Вот это вот реально очень удобно.
В JS переменные нельзя не объявлять. Если не объявлять, они станут глобальными и добавят багов. А в strict mode и вовсе не будет работать - не объявлять вообще нельзя.
Переменные можно не объявлять в python.
В Haskell можно явно не указывать типы, но они сами просчитаются на этапе компиляции с невиданной джаве строгостью, и если что-то не так, программист получит кучу сообщений. В итоге, если исправить ошибки компиляции, программа с большой вероятностью заработает правильно.
За тем, что концепция языка JS подразумевает, что у значений "нет типов" (они скрыты от программистов), а из этого следует что JS никогда не должен давать ошибку приведения типа, а из этого следует что должны быть правила приведения любого типа к любому типу, даже если по смыслу эти приведения полный нонсенс.
» 4 in l <- false
Programmer Memes
@iammemeloper
Without a doubt, the best programming language
11:09 PM -Sep28, 2023 121.6K ¡ews
» let l = [1,2,3,4]
<- undefined
» 0 in l <- true
» "0" in l <- true
11-1 = 10
'11' - 1 = 10
Пусть result=1+'1'
Будет ли разным значение result, если он изначально объявлен как string и если он изначально объявлен как integer?
если бы скрипты JS работали как программы на других языках - у нас бы постоянно валились сайты, не работала анимация и аякс из-за кривых баннеров или адблоков. а так - ну, не сработал кусок кода как нужно из-за неполученных данных - и хуй с ним, выполняемся дальше, не критично: пользователь информацию прочитать может, в БД ничего не пишется, при перезагрузке страницы скорей всего будет ок.
Хотя, в случаях, когда переменная не меняет свой тип, компилятор может выкинуть и эту информацию, и проверки. В таких случаях говорят, что на современных движках JS в некоторых случаях работает со скоростью C.
Надеюсь, в инглишь умеешь. Иначе наповал оно тебя не сразит
https://www.destroyallsoftware.com/talks/wat
В MVS вон тоже можно взять и настроить какой-нибудь Fortran90, что все переменные, которые не объявлены будут real, а все, которые начинаются с "i' и "j" - integer. Удобно, ровно до того момента, как тебе не придётся всё это портировать на другую платформу/компилятор/язык.
во временя скрипткидствования меня жутко радовало, что можно от строки отнимать или прибавлять числа и при наличии в ней цифр учитывались только они. но сейчас.. блять
иногда бывает хуй угадаешь где балабака зарыта
Так вот, там тоже переменные можно вообще не объявлять, но
(почти)всегда понятно какого типа переменная у тебя получилась: что в неё первое записалось, такого типа она и будет.Вот это вот реально очень удобно.
Переменные можно не объявлять в python.
В Haskell можно явно не указывать типы, но они сами просчитаются на этапе компиляции с невиданной джаве строгостью, и если что-то не так, программист получит кучу сообщений. В итоге, если исправить ошибки компиляции, программа с большой вероятностью заработает правильно.
decimal x = 0.1M;
decimal y = 0.3M;
return y-x;
то вернётся ровно 0.2, потому что мы записали 0.1 и 0.3 как точные числа, а если написать
double x = 0.1;
double y = 0.3;
return y-x;
то результирующее значение будет _примерно_ равно 0.2 только потому, что x изначально указан как _примерно_ равный 0.1 и у как _примерно_ равный 0.3