Подробнее
Не javascript-разработчик javascript-разработчик Javascript ужасен и полон противиречий Сначала выучи его, там все логично javascript-разработчик Javascript ужасен и полон противиречий javascript-разработчик Это точно
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
Еще на тему
При том, что массив - частный случай объекта в JS
for..in перебирает объект по ключам
for..of перебирает итерабальные объекты по значению
Я к общей неконсистентности поведения языка.
Возьмем тот же питончик. Есть for. Все объекты, у которых есть понятие ключ/значение уже умеют итерироваться. Т.е. не нужно придумывать отдельные языковые конструкции.
[1, 2, 3].append(4)
А что бы узнать размер листа, надо дергать встроенный метод
len([1, 2, 3]) == 3
Очень консистентно, очень православно, ага. При всех плюсах языка, пресловутая консистентность не одна из них.
> [1, 2, 3].append(4)
Это бесмысслено, т.к. результат — None. list — изменяемый объект и к нему логично привязывать новые ссылки если описан в виде переменной. @zloy_holodec, часто в js пишешь `([1, 2, 3]).push(4)`?
> len([1, 2, 3]) == 3
Это верно, т.к. используется общий подход для словарей, списков, кортежей, множеств, а также любых типов у которых определен соответствующий магический метод.
> пресловутая консистентность не одна из них
async и typing'и все ещё болезненные. В остальном — всё неплохо.
ты сверхразум
~~(+'5') + 3
{} + [] => +[], т.к. {} интерпретируется как пустой блок кода, а унарный плюс преобразует пустой массив в 0
[] + {} => "" + {} => "[object Object]", т.к. если один из операндов строка, то второй тоже преобразуется в строку ({}).toString() => "[object Object]"
Т.к. если впихнуть [] и {} в переменные, то результат {} + [] и [] + {} идентичен друг-другу и равен "[object Object]"
К сожалению, это издержки динамических языков. Во всяких макросах и скриптах по другом в принципе тяжело. Для браузеров... млин, вот чего не шарю, того не шарю. Может логичнее было пилить строгую типизацию, нужно создать параллельную вселеную и проверить.
TypeScript же
foo = '1'
bar = 2
print(foo+bar)
В Питоне приводит к эксепшону(увы, не на этапе парсинга), вместо попытки магически сложить строку с числом. В JS код молча сложит эти переменные, что точно так же приведет к багу, но лучше иметь явный стектрейс с эксепшеном, чем ловить undefined behavior и дебажить где именно получилось так, что пользователь на UI увидел какую-то фигню вместо нормально значения.
https://www.youtube.com/watch?v=0ZQk2SKDlYY
$ perl -mMath::BigFloat -e 'print "Equal\n" if Math::BigFloat->new(0.1) + 0.2 == 0.3;'
Equal
$ perl -mMath::BigFloat -e 'print "Equal\n" if Math::BigFloat->new(0.1) + 0.2 == 0.3;'
Equal