string formatter

by james young

HTML

<div id='output'></div>

JavaScript

var output = document.getElementById('output'),
    log,
    format;

format = function format() {
    var args = arguments[0],
        data,
        length = args.length,
        i,
        objects = [],
        response,
        x;

    if (typeof args[0] !== 'string') {
        for (i = 0; i < length; i++) {
            objects.push(args[i]);
        }

        response = objects.join(' ');
    } else {
        i = 1;
        data = args[0];
        response = data.replace(/%[sdj%]/g, function (match) {
            if (match === '%%') {
                return '%';
            }

            if (i >= length) {
                return match;
            }

            switch (match) {
                case '%s':
                    return String(args[i++]);

                case '%d':
                    return Number(args[i++]);

                case '%j':
                    try {
                        return JSON.stringify(args[i++]);
                    } catch (error) {
                        return '[Circular]';
                    }
                    break;

                default:
                    return match;
            }
        });

        for (x = args[i]; i < length; x = args[++i]) {
            response += ' ' + x;
        }
    }

    return response;
};

log = function log() {
    output.innerText = format(arguments);
};

log('hello %s %j', 'world', {foo: 'bar'})