J'utilise ce qui suit pour remplacer console.assert lorsqu'elle n'est pas disponible pour une raison quelconque.
Ce n'est certainement pas un standard de facto, et il est loin d'être idéal, mais il satisfait votre exigence que l'assertion ne soit pas évaluée en mode production. En outre, il vous montre l'expression qui a déclenché l'assertion échouée, ce qui facilite le débogage.
La syntaxe d'appel visqueuse (avec une expression de fonction) est là pour créer une fermeture, de sorte que la fonction assert a accès aux mêmes variables auxquelles son appelant a accès.
Je suppose que cela a un temps de compilation et d'exécution élevé, mais je n'ai pas essayé de le vérifier.
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]*$/, '');
}
}
Son utilisation ressemble:
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!
Peut-être juste un pépin de phrasé - mais la performance nulle est la production serait mauvaise. Peut-être que vous voulez dire des frais généraux proches de zéro. –
Assertions? Hm, 'console.assert()'? –
@ Marc B: vous avez raison :) le réparer. – BreakPhreak