Utilizo lo siguiente para reemplazar console.assert cuando no está disponible por la razón que sea.
Definitivamente no es un estándar de facto, y está lejos de ser ideal, pero satisface su requisito de que la afirmación no se evalúe en modo de producción. Además, le muestra la expresión que desencadenó la afirmación fallida, que ayuda a la depuración.
La sintaxis de llamada screwy (con una expresión de función) está ahí para crear un cierre, de modo que la función assert tenga acceso a las mismas variables a las que tuvo acceso el llamador.
Sospecho que esto tiene un alto tiempo de compilación y una sobrecarga de tiempo de ejecución, pero no he intentado verificarlo.
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]*$/, '');
}
}
Usando que parece:
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!
Quizás solo un error de fraseo, pero el rendimiento cero es producción sería malo. Quizás te refieres a una sobrecarga cercana a cero. –
Afirmaciones? Hm, 'console.assert()'? –
@Marc B: tienes razón :) arreglándolo. – BreakPhreak