Я учел скорость тримминга. Эта функция явно отличается от всех 24 конкурентов (многие из которых используют регулярные выражения), а также от родных string.trim () Chrome и Chromium (!) И работает так же быстро, как trim () Safari. Результаты теста здесь: http://jsperf.com/mega-trim-test/7
function trim27(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
return str.substring(i, j + 1);
}
Функция обрезает символы "\ n \ r \ t \ f", но легко добавить больше пробельных символов, например. те, которые regexp использует в качестве пробелов (\ s) с небольшой потерей производительности (см. http://jsperf.com/mega-trim-test/8).
Редактировать: предыдущий trim27 () обрезает только самые распространенные символы ("\ n \ r \ t \ f"), но чтобы обрезать все возможные пробелы, я включил ниже новую функцию mytrim ():
if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
var mytrim = function(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
return str.substring(i, j + 1);
};
else var mytrim = function(str) {
return str.trim();
}
Используйте это так:
var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"
Вышеупомянутый mytrim () выполняет следующие действия:
- Обрезает 26 различных пробелов (все из 25 пробелов, упомянутых в http://perfectionkills.com/whitespace-deviations/ и дополнительно uFEFF, который является НУЛЕВОЙ ШИРИНОЙ без пробела.
- Обеспечивает согласованность результатов обрезки в разных браузерах.
- Использует встроенную обрезку (), если она доступна И имеет возможность обрезать все 27 различных пробелов. Исключением являются Chrome и Chromium, которые имеют настолько медленную встроенную отделку (), что вместо встроенной мы используем нашу собственную отделку.
- И САМОЕ ВАЖНОЕ: Это не красиво и не коротко, но ЯВНО БЫСТРЕЕ, чем любая из 24 конкурентных альтернатив в http://jsperf.com/mega-trim-test/12 (исключение: довольно старый Firefox 3.6.25 в Windows 7 запускает mytrim () довольно медленно по неизвестной причине).