История изменений
Исправление
stevejobs,
(текущая версия)
:
какая половина перечисленного уже есть?
пройдусь задом наперед
как ты можешь сам проверить, 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 добавлять!
Исправление
stevejobs,
:
какая половина перечисленного уже есть?
пройдусь задом наперед
как ты можешь сам проверить, 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). Юникод - но не юникод. Вспоминается старый баян - ворота «машины - не машины, ставить - не ставить».
наверное, можно было бы больше поэму написать, но не в рабочее время(с)(тм)
И вот этот весь цирк длится годами. И это не какое-то высокоуровневое API, а прямо ядро. Вот его в первую очередь надо к чертям вычищать, а не SIMD добавлять!
Исходная версия
stevejobs,
:
какая половина перечисленного уже есть?
пройдусь задом наперед
как ты можешь сам проверить, 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). Юникод - но не юникод. Вспоминается старый баян - ворота «машины - не машины, ставить - не ставить».
наверное, можно было бы больше поэму написать, но не в рабочее время(с)(тм)
И вот этот весь цирк длится годами. И это не какое-то высокоуровневое API, а прямо ядро. Вот его в первую очередь надо к чертям вычищать, а не SIMD добавлять!