ЙажаСценарий / Говнокод #5316 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
function paramEncode(str){
	var text = escape(str);
	while(text.indexOf("%u") !=-1)
		text = text.replace("%u","!u");
	while(text.indexOf("%") !=-1)
		text = text.replace("%","!u00");
        while(text.indexOf(".") !=-1)                                                                                        
                text = text.replace(".","!u002E");   
        while(text.indexOf("/") !=-1)                                                                                        
                text = text.replace("/","!u002F");   
	return text;
}

альтернатива if:)

Запостил: moonie moonie, (Updated )

Комментарии (35) RSS

  • Блин, тоже самое хотел написать... ))) Опередили.
    Ответить
  • вообще-то в JS replace заменяет только первое вхождение искомого выражения.

    Поэтому или регекспом, или while
    Ответить
      • Давно хотел сравнить по производительности
        text.replace(a/g,'A'));
        и
        while(text.indexOf('a')!=-1) text.replace('a','A');
        да пока руки не доходят
        Ответить
        • да в чем проблема. написать оба выражение в цикле на охрененное колво итераций, замерить время, и поделить )

          это дело 5-10 мин )
          Ответить
          • Проблемы нету. Вспоминаешь про этот тест, только когда заходит разговор про while/regexp. И забываешь про этот тест через минуту.

            Сам обычно реплейсаю через регекспы:)
            Ответить
            • чето браузер валится от while(text.indexOf('a')!=-1) text.replace('a','A') 🙂
              Ответить
              • да. забыл переприсвоить. так он в бесконечный цикл уходит
                text = text.replace('a','A')
                Ответить
            • <html>
              <script>
              var cnt=100000;
              var text='aaaaaaaa';
              var t1=new Date();
              for(var i=0;i<cnt;i++) {
               text.replace(/a/g,'A');
              }
              var t2=new Date();
              document.write('re:'+(t2-t1)/cnt+' ');
              
              var t1=new Date();
              for(var i=0;i<cnt;i++) {
               while(text.indexOf('a')!=-1) text=text.replace('a','A');
              }
              var t2=new Date();
              document.write('while:'+(t2-t1)/cnt+' ');
              </script>
              </html>


              на последнем файрфоксе под хрюшей дал
              re:0.00209 while:0.00007
              Ответить
                • впринципе, это понятно, во втором случае мы организуем тупо цикл на замещение, а не более универсальный конечный автомат, пусть и "нативный"
                  Ответить
              • Только тогда еще

                for(var i=0;i<cnt;i++) {
                text = text.replace(/a/g,'A');
                }

                Хотя и без присваивания разница заметна невооруженным глазом
                Ответить
                • зачем? не надо.
                  мы заменяем одной инструкцией, но текст остается исходным для второго теста
                  во втором же присвоение нужно, потому что в цикле
                  Ответить
                  • replace не меняет исходную строку вроде бы.
                    Поэтому чтобы увидеть результат, то надо переприсвоить.

                    при
                    var text='aaaaaaaa';
                    text.replace(/a/g,'A') ;

                    text будет равен 'aaaaaaaa'
                    Ответить
                    • text = text.replace(/a/g,'A');

                      text будет равен 'АААААААА', а потом тогда второй тест сфейлит, ему нечего будет заменять. Либо перед вторым тестом тоже написать var text='aaaaaaaa';
                      Ответить
                      • извини, не сразу понял смысла фразы

                        "текст остается исходным для второго теста"

                        Тогда во втором тесте замена внутри while у тебя отработает только 1 раз.

                        Значит, подсчитанное время будет неверным.

                        "Либо перед вторым тестом тоже написать var text='aaaaaaaa';" - внутри цикла по i
                        Ответить
                        • точно, недоглядел
                          <html>
                          <script>
                          var cnt=100000;
                          
                          var t1=new Date();
                          for(var i=0;i<cnt;i++) {
                           var text='aaaaaaaa';
                           text=text.replace(/a/g,'A');
                          }
                          var t2=new Date();
                          document.write(text+' re:'+(t2-t1)/cnt+' ');
                          
                          var t1=new Date();
                          for(var i=0;i<cnt;i++) {
                           var text='aaaaaaaa';
                           while(text.indexOf('a')!=-1) text=text.replace('a','A');
                          }
                          var t2=new Date();
                          document.write(text+' while:'+(t2-t1)/cnt+' ');
                          </script>
                          </html>

                          AAAAAAAA re:0.00204 AAAAAAAA while:0.00443
                          Ответить
                          • Спасибо за тест.

                            Теперь видно, что не так все хорошо с while, как казалось сразу.
                            Ответить
                          • Для чистоты эксперимента можно добавить блок со split join:
                            t1=new Date();
                            for(var i=0;i<cnt;i++) {
                             var text='aaaaaaaa';
                             text=text.split('a').join('A');
                            }
                            t2=new Date();
                            document.write(text+' split:'+(t2-t1)/cnt+' ');

                            Опера пишет, что это немного медленнее, чем регулярка, но в 2 раза быстрее while.
                            Я так думаю, что на большом тексте разница будет намного заметнее. ГК защитан.
                            Ответить
  • - Мы в некотором роде знакомы, - усевшись за стол, выдал мой дружбан, съедая взглядом Егора.
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8