добавить полный юникод, пофиксить флоат (0.1+0.2 должен == 0.3), typeof должен возвращать нормальные значения (null, regex, NaN), parseInt должен отдавать дополнительный текст (если он есть), эквивалентные false значения должны быть или эквивалентны друг другу или перестать быть false (0, NaN, false, undedined, "), добавить оператор (не переопределяемый) hasOwnProperty для определения является ли свойство своим или из цепочки прототипов, точки с заятой в конце строк убрать, добить блочную область видимости, нормальные классы с нормальным наследованием, function arguments - как полноценный массив, вообще нормальные массивы, this в функциях ссылается на внешнюю функцию а не на глобальный скоп
и если подумать подольше, много другого еще нужно добавить кроме observe и SIMD :)
как ты можешь сам проверить, 0.1 + 0.2 != 0.3. Более конкретно, оно равно 0.30000000000000004. В оправдание приводятся отмазки про какие-то IEEEшные малявы на флоаты, которые вообще не про то. В результате сравнение флоатов не используется вообще. А вот что используется: (0.1 + 0.2).toFixed(3) == (0.3).toFixed(3). Т.е. чуваки взяли оператор (сравнение флоатов), запретили им пользоваться, и заставили вместо него писать порнографию. Грац, чо.
классов нету, есть уродливо работающий new - как минимум поэтому все юзают CoffeeScript вместо JS. Проблема еще в том, что классы в CS тоже полное говно в угоду JS-совместимости и быстрому компилятору. Хорошего решения всё еще нет!
бредовый that=this в каждой первой строчке взялся откуда? лень писать поэму, полное говно, это надо выжечь огнём (еще 10 лет назад, actually, надо было выжечь)
блочной области видимости нет:
var a = 1;
function four() {
if (true) {
var a = 4;
}
alert(a); // а вот хрен тебе, там будет 4 вместо 1, т.е. чудный if не умеет в блочную область видимости
}
тут можно бы сказать, что создатели компилятора не осилили в shadowing глобальных var'ов. (кстати, про глобальные переменные забыл поэму, это просто ад!)
но ведь та же хрень и для циклов:
var x = function() {for (var i=1; i<3; i++) {console.log("omg"); var z=3;} console.log(z);}; x();
(прости что всё в одну строчку, в редакторе лора нет автоформатирования. )
Явно временная (созданная на итерации цикла) переменная z сохранится при выходе из него и распечатается!!! ПЫЩ ПЫЩ в рот мне ноги, вот это проворонили косяк!
arguments - по-настроящему не массив, а объект со свойством length и ацессором [], поэтому с ним нельзя обращаться как с массивом, хотя по логике вещей это именно массив
когда итерируешься в цикле по пропертям объекта, нельзя итерироваться только по СВОИМ пропертям. Поэтому нужно юзать hasOwnProperty, и каждую пропертю тестировать. Но т.к. это не не-переопределяемый оператор, кто угодно может взять и заменить hasOwnProperty чем угодно. Have a nice debug!
if (x) - значит «if x==true». В реальной жизни x==false && y==false следует что => x==y. Это называется транзитивность. Но 0, NaN, false, undedined, пустая строка - все они falsy и не равны - не транзитивны. Good luck работать с нетранзитивными числами!
typeof NaN === 'number'. Not a number is a number? WTF? Но это не всё. Можно сказать, что NaN - это такое специальное значение типа Number, поэтому всё в порядке. Т.е. NaN - это обязательно число? А вот и держи фигу: isNaN('держи фигу') == true.
хрюникод в джаваскрипте 16-битный (Basic Multilingual Plane), он не умеет в двойные символы (surrogate pairs). Юникод - но не юникод. Вспоминается старый баян - ворота «машины - не машины, ставить - не ставить».
наверное, можно было бы больше поэму написать, но не в рабочее время(с)(тм)
ну конечно, для языка, напиленного в одно рыло студентом за 2 недели - это просто шедевр. Но после этих двух недель была еще вечность допилки, всякие стандарты новые...
И вот этот весь цирк длится годами. И это не какое-то высокоуровневое API, а прямо ядро. Вот его в первую очередь надо к чертям вычищать, а не SIMD добавлять!
забыл добавить, что typeof от регулярки может быть либо object, либо function xDDD А typeof null - вообще object! Вот это всё говнецо-то надо соскребать в первую очередь
В es6 классы есть, поддержку юникода выпрямили. == вместо === используют дятлы, они должны страдать. И т.п. Осиль сначала то что есть, вместо того чтобы ныть что яваскрипт не умеет яву и все плохо.
не стесняйся, расскажи про всё остальное. Для начала, про this, область видимости, глобальные переменные, arguments, сравнение флоатов, hasOwnProperty, typeof. Начнем с этого, лень сейчас придумывать что еще плохо :)
надо посмотреть на классы, да. В большинстве языков с классами всё плохо, i bet здесь тоже :)) Нужно будет прогнать es6 классы по corner cases (которые не выдерживает например упомянутая тобой ява - там всё плохо например с equals, особенно в сочетании с мапами, ужасно работающее множественное наследование, итп - годится на целую поэму «почему ява говнище»)
== вместо === используют дятлы
чего же вы, милок, не отключили в компиляторе использование == тогда?
Я тебе привел пример, что ты не понимаешь в том, о чем пытаешься писать. Расказывать как пользоваться яваскриптом, и соревноваться с бредогенератором - разные вещи.
чего же вы, милок, не отключили в компиляторе использование == тогда?
Лично у меня стоит eslint на тестах и CI, который не даст использвать == и много чего другого. А проблемы ниасиляторов матчасти меня мало волнуют. Пусть пользуются как напридумывали и страдают.
то есть получается, ты пишешь не на самом языке, а на неком подмножестве языка. Я и не спорю, что твое подмножество - офигенное. Мое тоже.
Но я стараюсь рассуждать из соображения, что единственная задача языка - помочь мне кодить как можно быстрее и эффективней. Например, Java позволяет кодить эффективней чем C++,
поэтому C++ отправляется на свалку истории. Итп. Но ведь на C++ можно привести такой же аргумент - если писать на C++x14, используя только особое подмножество - то всё будет отлично!
Но нет, мне не хочется изучать никакие подмножества. Garbage Collector джавы работает сам, и позволяет мне кодить лучше, и это замечательно, поэтому C++ отправляется на свалку. В Scala есть нормальное ООП, поэтому можно выбросить Java. В Scala есть паттерн-матчинг, а в C++ вместо этого нужно городить леса из Visitor'ов (и попробуй до них еще догадайся), поэтому C++ отправляется на ту же свалку. В Java и Scala есть нормальный рефлекшен, а в C++ нет, поэтому C++ отправляется... ну ты уже понял.
А вот чем заменить JS (с его совершенно неэффективным ) я пока не знаю, и это грустно. Приходится «асиливать». Я не хочу асиливать, я хочу чтобы просто работало, во всей его полноте.
Видишь, я же не тунеядствую на тему «JS говно», а предлагаю конкретные решения, где дизайн языка можно исправить в лучшую сторону. И не придется этот дизайн «асиливать», он сразу будет хороший.
Объясни как практически можно кодить на es6/es7 сейчас? Юзать Babel? Какой набор костылей надо притащить, чтобы заработало? Без буквоедства - вот ты сейчас скажешь набор костылей, а я их тупо себе импортну и буду с этим жить :)
А можешь написать свой набор библиотек/костылей? Именно что касается повседневной разработки. Я импортну их себе и постараюсь асилить :) Про lodash понял (ты его реально юзаешь?).
Он правда реальных проектов ни одного не сделал, но это же мелочи.
может быть он компиляторы разрабатывает, и тонко издевается над нами каким-то особым профессиональным юмором?
- если не хочешь совсем язык учить - втыкай lodash везде, будет работать как надо. - линтовщик типа eslint нужен обязательно. - es5-shim под лохматые браузеры - под классы сам найди, если приперло - сам не пользуюсь, прототипов хватает.
Если шило в одном месте - бери babel.
Совместимость можно гуглить по «XXX shim». Некоторые вещи типа proxy эмулировать принципиально нельзя, но таких не очень много.
если приперло - сам не пользуюсь, прототипов хватает
люди пишут на джаве и c#, и иногда надо поправить какую-нибудь менюшку. Открывают код на js, и тут у них случается баттхерт, т.к. там что-то совершенно не похожее на java/c# написано. Каждая задача про «поправить менюшку» сразу начинает «весить» не меньше трех дней, просто по факту общения с js. Недавно один чувак (не у меня, у друга в команде) писал «плагин для jquery» для показа каких-то ошибок на форме красеньким цветом - три недели! И это если надо поправить чужой код, если писать свой - там совсем всё печально случается, да..
В идеале, иметь бы просто браузерную реализацию Java и писать всё на ней, тогда таких факапов не случится. Конечно, есть http://www.scala-js.org, но что-то я очкую - на практике уже сама Scala слишком сложная для быстрого понимания, а уж нестабильная бета-версия скалы под браузер, с экзепшенами на двух языках сразу, это совсем грустно. Да и весит она начиная с нескольких мегабайтов, dead code elimination в динамические языки не завезли, а стандартная библиотека огромная.
какой-нибудь кейворд, или даже блочный скоуп, или для неасиляторов написания конпеляторов - просто use флаг, который говорит что дальше вся арифметика пойдёт в fixed point. Можно ввести какие-нибудь fixed point literals типа 0.1'+0.2'==0.3'. Можно вообще всё сделать наоборот: нецелые по-умолчанию сделать fixed point, а floats делать специальным литералом. Кучу вещей можно сделать, если вообще этим заниматься.
ну как же не сделать, просто 0.1'+0.2' == 0.3' транслировать в (0.1 + 0.2).toFixed(3) == (0.3).toFixed(3). Сахар разворачивания ' в .toFixed наверняка можно сделать не приходя в сознание, не?
Матчасть надо изучать только тем, кто с галерки пыжится. Хотя бы чтобы обсирать яваскрипт со знанием дела и не выглядеть как пенсионер-маразматик, гордящийся пыльными грамотами.
Матчасть надо изучать только тем, кто с галерки пыжится.
Не тобой ли выше по теме говорилось об осиливании матчасти для йотэсописания — всякие там eslint, лодаш и прочее? А теперь оказывается, что матчасть нужна для того, «чтобы обсирать яваскрипт со знанием дела».
Кому надопо делу - может просто спросить, и им расскажут минут за 10. А обсеруны с претензиями должны изучать самостоятельно и страдать, такие дела. Ну либо выглядеть старперами-дятлами, кому что больше нравится.