Блог о веб-технологиях и JavaScript

Реклама

Функция trim в JavaScript

В JavaScript нет встроенной функции для удаления пробелов в начале и конце строки, как например в PHP, где для этого используется функция trim. Под пробелами здесь подразумеваются символы SPACE, TAB, перенос строки и многое другое. Для реализации этой функции в JavaScript как правило пользуются регулярными выражениями. Один из таких способов опубликован в моей базе знания, в котором используется довольно таки простое регулярное выражение: «/^\s+|\s+$/».

Как оказалось, такое выражение будет работать правильно не во всех браузерах, поскольку символ «\s» реализован в них по-разному и некоторые символы не трактуются как «пробельные». Подробней об этом можете прочитать здесь (англ.). Из этого же источника привожу результаты сравнительных тестов, показывающих различие в работе со строками в различных браузерах.

Тесты браузеров на работу со строками

Как вариант решения этой проблемы, вместо выражения «\s» можно использовать группировку по симолам Unicode для обрезаемых символов:

[\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029]

Один из вариантов реализации функций trim, trimLeft и trimRight с использованием такой группировки я нашел в библиотеке vice-versa:

/** vice-versa String
 * @author      Andrea Giammarchi
 * @license     Mit Style License
 * @blog        http://webreflection.blogspot.com/
 * @project     http://code.google.com/p/vice-versa/
 * @version     0.20090710192302
 * @note        these method are about ECMAScript 5
 */

/** full specs String prototype trim, trimLeft, and trimRight
 * @target  Chrome, FireFox < 3.5, Internet Explorer, Opera, Safari
 */
(function(trim){
    var o = {
        trim:new RegExp("^" + trim + "|" + trim + "$", "g"),
        trimLeft:new RegExp("^" + trim),
        trimRight:new RegExp(trim + "$")
    },  k;
    for(k in o)
        if(!String.prototype[k])
            String.prototype[k] = (function(trim){
                return function(){
                    return this.replace(trim, "");
                };
            })(o[k]);
    delete o;
    delete k;
})("[\\x09\\x0A-\\x0D\\x20\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+");

Источник: http://code.google.com/p/vice-versa/source/browse/trunk/src/String.js.

  • Regent

    Хорошая заметка :)
    Только вот как разработчики использовали \s, так и будут использовать(
    Вопрос на засыпку: зачем удалять o и k внутри анонимной функции? :)

  • http://yablog.org.ua yAnTar

    Тоже, как использовал \s — так и дальше буду.
    Смотрел, как реализовано в jQuery — /^\s+|\s+$/g.

  • admin

    @Regent
    По поводу delete точно не скажу. Возможно автор обнаружил утечки памяти и добавил это.

    @yAnTar
    Если проблем с \s нет, то конечно изощряться и не нужно :)

  • Regent

    Точнее например если проблем с заказчиком нет, то конечно изощряться и не нужно :)
    А на свои проекты совесть работает :) Прийму к сведению, спасибо)

  • http://arty.name arty

    кстати, есть мощное исследование по скорости работы такой функции: http://blog.stevenlevithan.com/archives/faster-trim-javascript

  • http://htmlcoder.visions.ru/ alshur

    delete совсем не обязателен. даже в старых версиях браузеров утечки не обнаружил.

Дмитрий Ищенко © 2007 - 2014