• Что можно написать на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Часто применяется для:

    1. Локальные приложения и утилиты командной строки
    • Сборщики и трансляторы
    • Пакетная обработка и сценарии отложенной обработки
    • Скрипты, CLI (интерфейсы командной строки)
    • Генерация документации, отложенное формирование отчетов
    • Сценарии тестирования для других систем

    2. Серверы
    • Серверы веб-приложений и SPA
    • Серверы и API для мобильных приложений
    • Любые другие веб-API (RPC, JSON, REST)
    • Серверы сообщений и трансляция событий (чаты, игры, интерактив)
    • Заплаты на уже готовые системы, написанные на других языках, для реализации вебсокетов, SSE, лонг-пулинга и т.д., т.е. для затыкания дыр, для решения проблем в узких местах уже работающих систем.

    3. Клиенты
    • Оконные приложения (nw.js, node-webkit)
    • Кравлеры, парсеры и сбор данных

    4. Железо
    • Программирование микроконтроллеров (arduino, espruino, tessel)
    • Промышленная автоматизация

    Редко применяется (но подходит) для:
    • CMS, публикация контента (просто ниша уже занята и в этой задаче нода не дает чего-то принципиально нового или сверх соблазнительного).
    • Массовая электронная коммерция и торговля (не применяется для массовых движков магазинов, но используется отдельными крупными компаниями для торговых и платежных задач в качестве дополнительного средства к уже имеющемуся ПО, по сути закрывает узкие места).

    И плохо подходит:
    • Вычисления и моделирование, со скоростью математических операций нода и JS, как не типизированный язык, не дают хороших показателей
    • Научные приложения (по тем же причинам)
    Ответ написан
    10 комментариев
  • Хочу научиться программировать на JavaScript, с чего начать?

    @IceJOKER
    Web/Android developer
    От и до - learn.javascript.ru с полезными советами и примерами
    Ответ написан
    5 комментариев
  • Как делают вызов функции с разными параметрами?

    @bromzh
    Drugs-driven development
    Обычно всё вручную делают:
    function Foo(name, options) {
        this.name = name || 'default name';
        options = options || {};
        this.x = options.x || 100;
        this.y = options.y || 200;
        this.text = options.text || 'default value';
        this.fill = options.fill || 'default value';
    }

    Но надо быть осторожнее с ||. Это применимо только тогда, когда передаваемые параметры предполагаются не равными false (с двойным равно). Т.е. если x может принимать нулевое значение, то надо будет делать уже так:
    if (typeof params.x !== 'undefined') {
        this.x = params.x;
    } else {
        this.x = 100;  // значение по-умолчанию
    }

    Ну или использовать тренарный оператор, как уже написали.

    UPD
    Поясню логику. В js нет опциональных параметров. Однако, если функция объявлена с одним количеством аргументов, а вызывают её с меньшим, то ошибки не возникнет, а все незаполненные параметры становятся равными undefined внутри контекста функции. И, чтобы заполнить их какими-то данными по-умолчанию, используют логическое или - ||. Далее, имеется выражение: foo|| bar. Если foo будет соответствовать лжи, то выражение вернёт второй операнд. Если foo соответствует истине, то вернёт первый (в силу ленивости оператора). Тут есть тонкий момент. undefined соответствует лжи. Однако, если функия допускает значения foo, которые могут соответствовать лжи (null, false, {}, [], ''), то это выражение не будет работать правильно. Об этом надо помнить и обрабатывать такие случаи с помощью
    (if typeof foo === 'undefined') ? 'default value' : foo;
    .
    Ну и естественно, это выражение применимо и в обычных функциях (собственно, функция-конструктор и обычная функция ничем не отличаются, их отличает лишь использование, а именно - ключевое слово new). В таком случае пишут так:
    function foo(x, y, z) {
        x = x || 1;
        y = y || 'y';
        z = z || true;
        // После такой "инициализации" идёт код, использующий эти переменные.
    }

    Ну и в твоём примере точно таким же способом проверяются поля переданного объекта: если поле не передано в функцию, то при вызове его из объекта оно вернёт значение undefined.
    Ответ написан
    3 комментария