Sugar — подслащённый Javascript

    Что же такое Sugar?
    Это javascript-библиотека для работы со встроенными объектами javascript, которая:
    • расширяет встроенные объекты языка, добавляя полезные и интуитивно-понятные методы;
    • добавляет кросс-браузерную функциональность, где она сломана или ее нет;
    • полностью покрыта тестами;
    • легко взаимодействует с другими фреймоворками и сторонним кодом;
    • проста в понимании и использовании

    В качестве примера использования, автор приводит вот такой код:
    getLatestTweets(function(t) {
        var users = t.map('user').unique();
        var total = users.sum('statuses_count').format();
        var top = users.max('followers_count').first();
        var count = top.followers_count.format();
        var since = Date.create(top.created_at);
        return users.length + ' users with a total of ' + total + ' tweets.\n' +
        top.screen_name + ' is the top with ' + count + ' followers\n' +
        'and started tweeting ' + since.relative() + '.';
    });


    Не правда ли, код читается почти как английский текст.
    Самые нетерпеливые могут изучить предоставляемые функции по этой ссылке, а остальных ждёт краткое описание под катом.

    Массивы


    Sugar исправляет поддержку стандартных методов Javascript 1.6, таких как indexOf, forEach, reduce и др. Методы доработаны, чтобы принимать типы аргументов, которые стандартные функции не поддерживают: вложенные объекты, регулярные выражения, строки. При возможности будут использоваться нативные методы браузера. Полный список методов.
        ['a','b','c'].indexOf('c'); > 2
        [{ foo:'bar' }, { moo:'car' }].indexOf({ moo: 'car' }); > 1
        ['rocksteady','and','bebop'].map('length'); > [10,3,5]
        ['rocksteady','and','bebop'].sortBy('length'); > ["and","bebop","rocksteady"]
        ['rocksteady','and','bebop'].findAll(/o/); > ["rocksteady","bebop"]
        ['rocksteady','and','bebop'].first(1); > ["rocksteady"]
        ['rocksteady','and','bebop'].from(1); > ["and","bebop"]
        ['three','two','one'].groupBy('length'); > {"5":["three"],"3":["two","one"]}
        [1,65,2,77,34].average(); > 35.8
        [1,2].add([2,3]); > [1,2,2,3]
        [1,2].subtract([2,3]); > [1]
        [1,2].intersect([2,3]); > [2]
        [1,2].union([2,3]); > [1,2,3]


    Строки


    Sugar исправляет кросс-браузерные различия при использовании split с регулярными выражениями. Языковая поддержка улучшена добавлением методов, поддерживающих юникод и китайский, японский, греческий, иврит. Такие методы как each, words, lines, paragraphs были добавлены для гибкой работой с текстом. Полный список методов.
    'abcdefgh'.split(/[bdf]/); > ["a","c","e","gh"]
        'こんにちは'.hasHiragana(); > true
        '환영 합니다'.hasHangul(); > true
        'Добро пожаловать!'.hasCyrillic(); > true
        'welcome'.pad(1, ' ').pad(3, '-'); > "--- welcome ---"
        'hut!'.repeat(3); > "hut!hut!hut!"
        'off with her head!'.words(); > ["off","with","her","head!"]
        'off with her head!'.each(/he.+?\b/g); > ["her","head"]
        'off with her head!'.startsWith(/[a-z]ff/); > true
        'off with her head!'.first(3); > "off"
        'off with her head!'.from(3); > " with her head!"


    Числа


    Основные методы объекта Math доступны в Sugar в качестве шорткатов. Дополнительные плюшки — это округление с необходимой точностью, выравнивание чисел и их форматирование. В Sugar также есть методы, которые связывают числа в датами для легкой конвертации одноих в другие. Полный список методов.
        (125.425).round(2); > 125.43
        (125.425).round(-2); > 100
        (4235000).format(); > "4,235,000"
        (50).pad(5); > "00050"
        (23).ordinalize(); > "23rd"
        (5).upto(10); > [5,6,7,8,9,10]
        (5).daysAfter('Wednesday'); > "Monday, August 8, 2011 00:00"
        (5).yearsBefore('2001'); > "Monday, January 1, 1996 00:00"
        (5).times(function() {
        /* Run 5 times */
        })



    Даты


    Sugar добавляет к датам метод Date.create, который понимает даты в различных форматах (к сожалению дд.мм.гггг не понимает) — текстовых, относительых, абсолютных, timestamp'ы. Даты можно выводить в различных форматах с помощью простого синтаксиса. С помощью метода is, который понимает все форматы ввода дат, можно производить сложные сравнения. Полный список методов.
        Date.create('June 15, 2002'); > "Saturday, June 15, 2002 00:00"
        Date.create('2002-06-15'); > "Saturday, June 15, 2002 00:00"
        Date.create('2002/06/15'); > "Saturday, June 15, 2002 00:00"
        Date.create('15 June, 2002'); > "Saturday, June 15, 2002 00:00"
        Date.create('today'); > "Monday, August 1, 2011 00:00"
        Date.create('2 days ago'); > "Saturday, July 30, 2011 20:26"
        Date.create(888888888899); > "Tuesday, March 3, 1998 04:34"
        Date.create('the 15th of last month'); > "Friday, July 15, 2011 00:00"
        Date.create('the first day of 1998'); > "Thursday, January 1, 1998 00:00"
        Date.create().format('{12hr}:{mm} {tt} on {Weekday}'); > "8:26 pm on Monday"
        Date.create('3200 seconds ago').relative(); > "53 minutes ago"
        Date.create().iso(); > "2011-08-01T16:26:20.122Z"
        Date.create().isAfter('May 25');> true
        Date.create().is('tuesday'); > false
        Date.create().is('July'); > false
        Date.create().is('the 7th of June'); > false
        Date.create().addDays(2); > "Wednesday, August 3, 2011 20:26"
        Date.create().addMonths(2); > "Saturday, October 1, 2011 20:26"
        Date.create().addYears(2); > "Thursday, August 1, 2013 20:26"



    Объекты


    Хотя Sugar прямо и не взаимодействует с Object.prototype, библиотека обеспечивает несколько шортактов для доступа к метода класса Object. Один из них — это Object.extended, который создает объект-хеш, у которого есть методы, аналогичные доступным в других языках. Также добавляются методы проверки типа, такие как isString, isFunction и др. Полный список методов.
        Object.extended({ broken: 'wear' }).keys(); > ["broken"]
        Object.extended({ broken: 'wear' }).values(); > ["wear"]
        Object.keys({ broken: 'wear' }); > ["broken"]
        Object.clone({ broken: 'wear' }); > {"broken":"wear"}
        Object.isString('yes, it is'); > true
        Object.isFunction(function() {}); > true



    Функции


    В Sugar есть основные методы, такие как bind, который позволяет определить область видимости функции. Также есть методы delay, defer и Function.lazy, который позволяет создавать замыкания для вычислений, создающих большую нагрузку на CPU. Полный список методов.
        (function(a) {
        /* this = 'wasabi', a = 'bobby' */
        }).bind('wasabi', 'bobby')();
        (function() {
        /* delayed 500ms */
        }).delay(500);
        [1,2,3].each(Function.lazy(function() {
        /* Each iteration will occur 5ms after the previous one */
        }, 5));


    * This source code was highlighted with Source Code Highlighter.

    Полезные ссылки:
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 30

      +9
      ['rocksteady','and','bebop'].first(1); > ["rocksteady"]
      ['rocksteady','and','bebop'].from(1); > ["and","bebop"]
      


      Честно говоря необходимость данных методов меня обескураживает.

      ['rocksteady','and','bebop'].slice(0, 1); > ["rocksteady"]
      ['rocksteady','and','bebop'].slice(1); > ["and","bebop"]
      


      И кстати писать в тегах framework это кощунство.
        0
        В Sugar есть основные методы, такие как bind, который позволяет определить область видимости функции.

        Вы хоть знаете что такое область видимости, Хаскелл Карри от этих слов в гробу перевернулся.
          +2
          С удовольствие исправлю пеервод scope на более подходящий.
            0
            .bind просто делает так называемое каррирование.

            Ну, а вообще порой так раздражает когда кто то использует слова не по их значению ( это я не про вас а про автора этой библиотеки :), Function.lazy довольно кощунственное название учитывая то что ленивыми вычислениями принято считать вычисления которые делаются по необходимости.
              +1
              В первую очередь bind позволяет задать контекст для функции (this), а во вторую карирование или фолдинг.
              Согласен с вами насчет lazy, правильное название должно быть defer или что-то вроде этого.
          +2
          Пардон, что-то у автора много раз встречается framework на странице, вот и дописал. Удалили из тегов.
            +1
            Согласен с вами, на этом список не заканчивается.

            Не пойму, чем эти конструкции лучше нативных?
            [1,2].add([2,3]); -> [1,2].push(2,3); или [1,2].concat(3,4)
            'off with her head!'.each(/he.+?\b/g); -> 'off with her head!'.match(/he.+?\b/g);
            'off with her head!'.startsWith(/[a-z]ff/); -> /^[a-z]ff/.test('off with her head!');
            'off with her head!'.first(3); -> 'off with her head!'.substr(0, 3);
            'off with her head!'.from(3); -> 'off with her head!'.substr(3);
            (125.425).round(2); -> (125.425).toFixed(2);
            Date.create('June 15, 2002'); -> new Date('June 15, 2002');
            Date.create('2002/06/15'); -> new Date('2002/06/15');
            Date.create('15 June, 2002'); -> new Date('15 June, 2002');
            Date.create(888888888899); -> new Date(888888888899);
            

            Сдается что люди уже не знают как выглядит нативный js и что в нем есть…

            А следующее работает в браузерах последних лет и без sugar.
            ['a','b','c'].indexOf('c');
            Object.keys({ broken: 'wear' });
            (function(a) {
              /* this = 'wasabi', a = 'bobby' */
            }).bind('wasabi', 'bobby')();
            Date.create('2002-06-15'); -> new Date('2002-06-15');
            Date.create().iso(); -> (new Date).toISOString()
            

            +3
            Нечто похожее documentcloud.github.com/underscore/.
              0
              У них на сайте написано, что основное отличие в том, что Sugar модифицирует нативные объекты и больше ориентируются на производительность. Интересно, так ли это и на много ли производительность выше, чем у underscore?
                +1
                А я так понял, что наоборот сказано, что underscore.js ориентирован на производительность, а sugar — на интуитивно-понятный синтаксис.
                Sugar modifies native objects, and is more concerned with intuitive syntax, whereas Underscore.js leaves native objects alone, and is more oriented toward performance.
                  0
                  Да, вы правы, не правильно прочитал

                  В таком случае, underscore выглядит предпочтительней, плюс весит в пять раз меньше
              –5
              Выглядет неплохо, надо изучить по подробнее, может есть смысл заюзать :)
                0
                на сайте sugarjs.com/ когда нажимаю на Like Facebook, он автоматически убирает мой лайк… мм…
                  +20
                  Это потому, что Like не от чистого сердца =)
                • НЛО прилетело и опубликовало эту надпись здесь
                    +1
                    Очередной PrototypeJS
                      0
                      С первым согласен, со вторым (про «добавление кроссбраузерной функциональности») — нет. Сейчас уже вполне можно делать приложения, не оглядываясь на IE6/7 и даже 8, а для совместимости использовать подобные библиотеки. Необходимость в такого рода «ручной» оптимизации очень редка.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          А расшифруйте, если не трудно. И если можно, с примерами из реальной жизни.
                        –1
                        Особенно расстраивают, так называемые, «доработки»:
                        [{ foo:'bar' }, { moo:'car' }].indexOf({ moo: 'car' });
                          +1
                          Для минусующих:
                          { moo:'car' } != { moo:'car' }; // true
                        –1
                        потестил — «блин, круто»!
                          0
                          Штука интересная, но как для синтаксического сахара многовато весит, конечно, возможно, я недооцениваю его.
                            0
                            Для серверсайда — чудесно. А вот для клиента таки да.
                              +1
                              53КБ сжатая версия и 184КБ распакованная. Это разве много?
                                0
                                Ну да, для microjs.com тяжеловат. Не всегда все нужно, кастомный билд бы ему…
                                –1
                                Сладко
                                  +2
                                  Чем оно лучше Мутулз?
                                    0
                                    Понравилось, однако «влезание в прототипы» — практика мягко говоря опасная и уж тем более не добавляет библиотеке легкости во взаимодействии с другими библиотеками. Так что четвертый пункт надо бы вычеркнуть. Но даже без него библиотека смотрится довольно интересно. В своих проектах, пожалуй, буду использовать.
                                      0
                                      Расширять базовые объекты своими нестандартными свойствами (а их здесь валом) — ужасная практика.

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое