JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 50 51 [52] 53 54 ... 65 66 ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#766
,
|
|
|
|
Да просто скажи, что хочется годного, качественного срача, и все |
|
Сообщ.
#767
,
|
|
|
|
ну спасибо сразу видно профессионала фронтэнда издалека. За долю секунды, мановением руки и острым орлиным взором он уменьшит в 10 раз потребеление памяти, одним взглядом организует архитектуру на основе MVVM, движением пальца заставит работать WebSQL с откатом на localStorage и даже не смотря код, найдёт в чём ошибка.Блин, с таким подходом я был год назад, когда устраивался фронтэндером, думал мол JQuery, HTML, лажа полная и все дела, а теперь понимаю что весь код на JS, что писал (собственно как и 90% "веб-разработчиков") - был полным быдлокодерством. Сравни, вот такой пример: ![]() ![]() function some(num){ return 42 + (parseInt(num) > 0 ? parseInt(num) : 0); } some(23); //65 и вот такой: ![]() ![]() var some = function(num){ return (function(num){ return 42 + (num|0)||0; })(num); }; some(23); //65 второй: 1) благодаря замыканию - все данные\переменные после использования уничтожаются 2) не висит в глобальной области видимости (можно в любой момент взять и удалить) 3) легко организовать прототипное наследование 4) легко превратить в объект (ака добавить конструктор) 5) операция проверки существования значения выполняется в два раза быстрее, благодаря логическому "и" 6) операция приведения к int выполняется от 20% (хром) до 80% (ие) процентов быстрее, благодаря бинарной "или" А можно ещё написать вот так: ![]() ![]() namespace('MySpace.SomeFoo', function(){ return this.some = function(num){ return (function(num){ return 42 + (num|0)||0; })(num); }; })); MuSpace.SomeFoo.some(23); //65 /* Немного магии */ this.namespace=function(space,cb){var ns,stack,_i,_len,_ref;stack='';_ref=space.split('.');for(_i=0,_len=_ref.length;_i<_len;_i++){ns=_ref[_i];stack+=ns;eval('if(typeof '+stack+'=="undefined"){'+stack+'=function(){}}');stack+='.';}return cb.apply(eval(space));}; Добавлено Mr. #define уже выехал Добавлено Цитата Астарот @ В общем не скажу за всю Одессу, но лично я для себя не вижу никакого смысла в использовании кофескрипта - реального функционала не добавляет, за то появляется лишний слой, который хрен знает как работает. И если на вопрос "как ЭТО работает в js" ответить можно моментально, благо база знаний ого-го, то тот же вопрос с кофескриптом может добавить анальной боли. ты ошибаешься, ты просто не пробовал, полностью солидарен с оратором, на JS я обратно уже не перейду ![]() ![]() echo = console.log class Some constructor: (any = 0) -> @foo(any) foo: (someNumber) -> echo 42 + someNumber; new Some намного чище, чем: ![]() ![]() var Some, echo; echo = console.log; Some = (function() { function Some(any) { if (any == null) { any = 0; } this.foo(any); } Some.prototype.foo = function(someNumber) { return echo(42 + someNumber); }; return Some; })(); new Some; Добавлено Цитата Астарот @ Учитывая, что на js можно извратится так, что не сразу понятно как оно работает я не уверен что кофескрипт не кастрирует эти возможности. приведи пример я напишу на кофе любое твоё порочное барокко произведение |
|
Сообщ.
#768
,
|
|
|
|
Цитата Serafim @ Сравни, вот такой пример: ![]() ![]() function some(num){ return 42 + (parseInt(num) > 0 ? parseInt(num) : 0); } some(23); //65 и вот такой: ![]() ![]() var some = function(num){ return (function(num){ return 42 + (num|0)||0; })(num); }; some(23); //65 второй: 1) благодаря замыканию - все данные\переменные после использования уничтожаются 2) не висит в глобальной области видимости (можно в любой момент взять и удалить) 3) легко организовать прототипное наследование 4) легко превратить в объект (ака добавить конструктор) 5) операция проверки существования значения выполняется в два раза быстрее, благодаря логическому "и" 6) операция приведения к int выполняется от 20% (хром) до 80% (ие) процентов быстрее, благодаря бинарной "или" Да это просто жесть какая-то. В любом нормальном языке это делается как в первом примере (только без parseInt) и нет тех минусов, что ты перечислил. В общем спасибо, теперь я буду еще больше сторониться JS. |
|
Сообщ.
#769
,
|
|
|
|
Цитата Serafim @ Mr. #define уже выехал Невалидные литералы даже #define ом не создаются Равно как и постфиксный унарный -Цитата Serafim @ А можно ещё написать вот так: На моем калькуляторе Citizen можно так: ![]() ![]() 42 + 23 Могу ли я утверждать, что мой калькулятор лаконичнее JS? )) |
|
Сообщ.
#770
,
|
|
|
|
Цитата korvin @ Да это просто жесть какая-то. В любом нормальном языке это делается как в первом примере (только без parseInt) и нет тех минусов, что ты перечислил. как видишь и в js так же делается, только нормальные люди заботятся о клиенте и пишут скрипты, которые будыт и быстрее работать, и меньше памяти сжирать, и быстрее убираться сборщиком Добавлено Цитата Мяут-Настоящий @ Невалидные литералы даже #define ом не создаются Равно как и постфиксный унарный - ну вот, ты обрущил мой веру во всемогущество препроцессора =((( Добавлено Цитата Мяут-Настоящий @ Могу ли я утверждать, что мой калькулятор лаконичнее JS? угу |
|
Сообщ.
#771
,
|
|
|
|
А вот если диффур посчитать, то javascript полаконичнее будет
|
|
Сообщ.
#772
,
|
|
|
|
Цитата korvin @ и нет тех минусов, что ты перечислил. да ты что, ну иди и проверь, что будет быстрее работать в руби и\или питоне: ![]() ![]() var = if var.to_int then var else 0 или ![]() ![]() var = var||0; тоже самое с преобразованием типов |
|
Сообщ.
#773
,
|
|
|
|
Цитата Serafim @ как видишь и в js так же делается, только нормальные люди заботятся о клиенте и пишут скрипты, которые будыт и быстрее работать, и меньше памяти сжирать, и быстрее убираться сборщиком Еще раз для непонятливых: в нормальных языках первый вариант работает также хорошо, как и второй и необходимости в таких костылях нет. Добавлено Цитата Serafim @ да ты что, ну иди и проверь, что будет быстрее работать в руби и\или питоне: ![]() ![]() var = if var.to_int then var else 0 или ![]() ![]() var = var||0; тоже самое с преобразованием типов Да при чем тут это? Я про этот твой финт с замыканием. И зачем to_int ? |
|
Сообщ.
#774
,
|
|
|
|
Цитата korvin @ Да при чем тут это? Я про этот твой финт с замыканием. И зачем to_int ? да пофигу, потому ожидает числовое значение |
|
Сообщ.
#775
,
|
|
|
|
Цитата Serafim @ да ты что, ну иди и проверь, что будет быстрее работать в руби и\или питоне: ![]() ![]() var = if var.to_int then var else 0 или ![]() ![]() var = var||0; тоже самое с преобразованием типов Я проверю на JS пожалуй: http://liveworkspace.org/code/2UMRHN$0 ![]() ![]() var some = function(num) { var n = parseInt(num); return n > 0 ? n + 42 : 42; }; function main() { var sum = 0; for (var i = 0; i < 1000000; i++) { sum += some("23"); } return sum; } print(main()); 0.14 s http://liveworkspace.org/code/45hG4h$0 ![]() ![]() var some = function(num){ return (function(num){ return 42 + (num|0)||0; })(num); }; function main() { var sum = 0; for (var i = 0; i < 1000000; i++) { sum += some("23"); } return sum; } print(main()); 0.34 s http://liveworkspace.org/code/45hG4h$1 ![]() ![]() var some = function(num){ return 42 + (num|0)||0; }; function main() { var sum = 0; for (var i = 0; i < 1000000; i++) { sum += some("23"); } return sum; } print(main()); 0.18 s Так что ты там говорил про скорость? |
|
Сообщ.
#776
,
|
|
|
|
Цитата korvin @ Еще раз для непонятливых: в нормальных языках первый вариант работает также хорошо, как и второй и необходимости в таких костылях нет. это ты про объект головного мозга руби, где всё работает одинаково плохо, так, что ему стоит присудить медаль самого медленного и тормознутого языка мира (кстати эта шутка не далека от истины, я пока не видел ни одного языка медленнее руби, даже говнокодистый битрикс быстрее будет чем хеллоуворлд на руби) |
|
Сообщ.
#777
,
|
|
|
|
Цитата Serafim @ да пофигу, потому ожидает числовое значение Не, ты расскажи, чем отличается "if var then" от "if var.to_int then" Добавлено Цитата Serafim @ это ты про объект головного мозга руби, где всё работает одинаково плохо, так, что ему стоит присудить медаль самого медленного и тормознутого языка мира (кстати эта шутка не далека от истины, я пока не видел ни одного языка медленнее руби, даже говнокодистый битрикс быстрее будет чем хеллоуворлд на руби)Какие ваши доказательства? Руби с 1.9 версии не уступает остальным языкам своего уровня. |
|
Сообщ.
#778
,
|
|
|
|
Цитата korvin @ Так что ты там говорил про скорость? скорость операторов, но это не значит что всей конструкции Раз: ![]() ![]() function some(num){ return 42 + (num||0); }; print(some(23)); print(some()); http://liveworkspace.org/code/3NhtPk$4 execution time: 0.08 ![]() ![]() function some(num){ return 42 + (num ? num : 0); }; print(some(23)); print(some()); http://liveworkspace.org/code/3NhtPk$3 execution time: 0.09 ![]() ![]() function some(num){ return 42 + parseInt(num); }; print(some(23)); print(some(2.5)); http://liveworkspace.org/code/3NhtPk$7 execution time: 0.1 ![]() ![]() function some(num){ return 42 + num|0; }; print(some(23)); print(some(2.5)); http://liveworkspace.org/code/3NhtPk$8 execution time: 0.06 Естественно замыкание требует большего времени, но оно не оставляет следов в памяти после использования, т.е. все внутренние значения уничтожаются. Добавлено Цитата korvin @ Не, ты расскажи, чем отличается "if var then" от "if var.to_int then" ну вот пример: ![]() ![]() function checkSome(value){ return value ? true : false; // для наглядности }; print(checkSome(42)); // true print(checkSome(0.5)); // true print(checkSome('23')); // true print(checkSome('Undefined server error')); // true ![]() ![]() function checkSome(value){ return value|0 ? true : false; // для наглядности }; print(checkSome(42)); // true (42 -> 42) print(checkSome(0.5)); // false (0.5 -> 0, как пример 2.5 -> 2, будет true) print(checkSome('23')); // true ('23' -> 23) print(checkSome('Undefined server error')); // false (string -> 0) Добавлено учитывая к примеру, что данные могут приходить с сервера, а произойти там может что угодно - надо однозначно выполнять условия что бы всё по ошибке не накрылось Добавлено Цитата korvin @ Руби с 1.9 версии не уступает остальным языкам своего уровня. а в релизе руби 2 - 180 незакрытых критических тасков, ага, знаем. Ну вот примеры сравнения самых популярных серверных языков: http://benchmarksgame.alioth.debian.org/u3...=php&lang2=yarv http://benchmarksgame.alioth.debian.org/u3...hon3&lang2=yarv http://benchmarksgame.alioth.debian.org/u3...perl&lang2=yarv http://benchmarksgame.alioth.debian.org/u3...java&lang2=yarv и особенно JS http://benchmarksgame.alioth.debian.org/u3...g=v8&lang2=yarv как видно из примеров, руби проигрывает по скорости, как минимум в 80-90% случаях (т.е. может победить в 1-2 тестах из 10) Добавлено К слову о JS, в некоторых тестах он приближается к компилируемым языкам ![]() http://benchmarksgame.alioth.debian.org/u3....php?test=fasta |
|
Сообщ.
#779
,
|
|
|
|
Цитата Serafim @ скорость операторов, но это не значит что всей конструкции Раз: Поэтому у меня там три примера, если ты не заметил. Не-не-не, Дэвид Блейн, результаты разные, а разница в скорости слишком мала. http://liveworkspace.org/code/Atn2P$0 http://liveworkspace.org/code/UeUJW$0 Добавлено Цитата Serafim @ Естественно замыкание требует большего времени, но оно не оставляет следов в памяти после использования, т.е. все внутренние значения уничтожаются. Это JS-опроблемы. |
|
Сообщ.
#780
,
|
|
|
|
Цитата korvin @ Не-не-не, Дэвид Блейн, результаты разные, а разница в скорости слишком мала. ну я приводил в пример первый попавшийся результат В любом случае даже такой пример показывает колебание первого примера (твоей ссылки) от 0.7 до 1, во втором же от 0.8 до 1, согласен что разница не так уж и велика Добавлено Цитата korvin @ Это JS-опроблемы. это ему не мешает быть в 53 раза быстрее руби (от 1\53 до 1\1) http://benchmarksgame.alioth.debian.org/u3...g=v8&lang2=yarv |