Быстрый trim для JavaScript
Самый быстрый trim на JavaScript выглядит странно:
function trim12 (str) {
var str = str.replace(/^\s\s*/, ''),
ws = /\s/,
i = str.length;
while (ws.test(str.charAt(--i)));
return str.slice(0, i + 1);
}Код взят из блога Flagrant Badassery. Цикл с регуляркой быстрее, чем простое регулярное выражение /\s+$/, а кроме того, \s\s* быстрее, чем \s+? OMG!
Комментарии 13
Регулярные выражения — это же не магия, а конечные автоматы. ^_^
Это вполне понятно — цикл делает только то, что надо — сравнивает с «пробельным классом символов» по одному символы, начиная с конца строки, пока они есть.
А «простое регулярное выражение» начинает сопоставляться с каждого «пробельного» символа, начиная с начала строки, потом обламывается, не обнаружив конца строки после пробелов (если их было несколько подряд — то всё равно пытается проделать то же самое начиная со второго из них, и т.д…).
Это не столь очевидно, правда, напоминает фридловскую «развёртку регекспа», но сейчас не помню, почему она эффективнее._-')
(И не понимаю, почему оно эффективнее _здесь_. -
http://pcre.org/pcre.txt
“Consider a simple pattern such as ‘abcd$’ when applied to a long string that does not match. Because matching proceeds from left to right, PCRE will look for each «a» in the subject and then see if what follows matches the rest of the pattern.”
Как всё
Соответственно — методы массива на большом массиве работают быстрее, чем литеральная его обработка после join.
Ведь
Так и получается, когда «все есть объект».
Я на стопяцот процентов уверен, что «откуси» он достаточный кусок СНАЧАЛА и с КОНЦА и обработай оба одной и той же регуляркой /^\s+|\s+$/ а потом слепи он это обратно — будет не медленнее его конечного варианта. Но так же извратно по сути. :)
http://forjoomla.ru/regulyarnie-virajeniya … cript.html