Я использую следующее для замены 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!