Утверждения в JavaScript - PullRequest
       36

Утверждения в JavaScript

5 голосов
/ 12 сентября 2011

Подробное чтение о различных платформах утверждений в JavaScript. Есть ли какая-нибудь де-факто / самая распространенная "стандартная" библиотека / фреймворк? При выборе одного из них - какие пункты наиболее заслуживают внимания?

Единственное требование, о котором я могу думать, - это почти нулевые издержки производительности в рабочем режиме.

Ответы [ 4 ]

6 голосов
/ 12 сентября 2011

Два возможных решения:

С помощью сценария выпуска сборки удалите строки Assert.

или

Сценарий сборки должен переопределить функцию Assert, поэтому она будет пустойфункция.Недостатком этого является то, что если вы утверждаете, что в вызове есть логика [aka assert (x> 100, "foo")], то эта логика [x> 100] все еще будет выполняться.

4 голосов
/ 29 декабря 2011

Вот что я использую:

Когда я работаю над кодом, у меня есть initDevMode (); вверху файла, с которым я работаю, и когда я готов к выпуску в производство, я просто удаляю эту строку, и все утверждения просто переходят к пустой функции.

/**
 * Log a message to console:
 *  either use jquery's console.error
 *  or a thrown exception.
 *  
 *  call initDevMode(); before use to activate
 *  use with:
 *      assert(<condition>, "message");
 *      eg: assert(1 != 1, "uh oh!");
 *  
 *  Log errors with:
 *       errorLog(message);
 *       eg: errorLog(xhr.status);
 */
assert = function(test, msg) { }
errorLog =function(msg) { }

initDevMode = function() {
    assert = function(test, msg) {
        msg = msg || "(no error message)";
        if(!test) {
            try {
                    throw Error();
                } catch(e) {
                    var foo = e;
                    var lines = e.stack.split('\n');
                    for(i in lines) {
                        if(i > 2) {
                        errorLog(msg + lines[i]);
                    }
                }
            }
        }
        throw("Assertion failed with: " + msg);
    };
    errorLog = function(msg) {
        if(typeof console.error == 'function') { 
            console.error(msg);
        } else {
            function errorLog(msg) {
                console.log("foo");
                setTimeout(function() {
                    throw new Error(msg);
                }, 0);
            }
        }
    };
}
2 голосов
/ 02 февраля 2013

Я использую следующее для замены console.assert, когда он по какой-либо причине недоступен.

Это определенно не стандарт де-факто, и он далек от идеала, но он удовлетворяет вашему требованию, что утверждениене оцениваться в производственном режиме.Кроме того, он показывает вам выражение, которое вызвало ошибочное утверждение, что помогает отладке.

Синтаксис вызывающего винта (с выражением функции) существует для создания замыкания, так что функция assert имеет доступ к тому жепеременные, к которым у вызывающей стороны был доступ.

Я подозреваю, что это приводит к высоким накладным расходам во время компиляции и выполнения, но я не пытался это проверить.

function assert(func) {
    var name;
    if (typeof(ENABLE_ASSERTIONS) !== "undefined" && !ENABLE_ASSERTIONS) {
        return;
    }
    name = arguments.callee.caller;
    name = name ? name.name : "(toplevel)";
    if (!func()) {
        throw name + ": assertion failed: " + ('' + func).replace(/function[^(]*\([^)]*\)[^{]*{[^r]*return/, '').replace(/;[ \t\n]*}[ \t\n]*$/, '');
    }
}

Использованиевыглядит так:

function testAssertSuccess() {
    var i = 1;
    assert(function() { return i === 1; });
}
function testAssertFailure() {
    var j = 1;
    assert(function() { return j === 2; });
}
ENABLE_ASSERTIONS = true;
testAssertSuccess();
testAssertFailure();

HTH!

0 голосов
/ 18 января 2013

Взгляните на Джаскри ; в основном это инструмент, который может удалять утверждения с почти произвольной логикой из вашего кода. Это удобно использовать в качестве пакетного процессора для генерации вашего производственного кода или для каталога сценариев с поддержкой fastcgi, который вы можете использовать, когда вам нужно протестировать производительность / профилировать ваш код.

...