什么是JavaScript中的“断言”?
JavaScript中的assert
是什么意思?
我见过类似的东西:
assert(function1() && function2() && function3(), "some text");
并想知道什么方法assert()
所做的。
JavaScript中没有assert
(然而,还有一个关于增加一个的话题 ,但是它还处于早期阶段)。 也许你正在使用一个库提供一个。 通常的意思是如果传递给函数的expression式是false,则抛出一个错误; 这是断言检查的一般概念的一部分。 通常,断言(因为他们被称为)只用于“testing”或“debugging”构build和剥离生产代码。
假设你有一个应该总是接受一个string的函数。 你会想知道是否有人用那些不是string的东西来调用这个函数。 所以你可能会这样做:
assert(typeof argumentName === "string");
…如果条件是错误的, assert
会抛出一个错误。
一个非常简单的版本将如下所示:
function assert(condition, message) { if (!condition) { throw message || "Assertion failed"; } }
更好的是,如果JavaScript引擎支持它,那么使用Error
对象(真的是旧的可能不会),它有收集堆栈跟踪的好处,例如:
function assert(condition, message) { if (!condition) { message = message || "Assertion failed"; if (typeof Error !== "undefined") { throw new Error(message); } throw message; // Fallback } }
即使IE8有Error
(虽然它没有stack
属性,但现代引擎[包括现代IE])。
如果使用现代浏览器或nodejs,则可以使用console.assert(expression, object)
。
了解更多信息:
- Chrome API参考
- Firefox Web控制台
- Firebug Console API
- IE控制台API
- 歌剧蜻蜓
- Nodejs控制台API
其他答案是好的:没有内置到ECMAScript5中的断言函数(例如,基本上在任何地方工作的JavaScript),但是一些浏览器给你提供或者具有提供该function的附加组件。 尽pipe为此可能最好使用一个完善的/受欢迎的/维护的图书馆,但为了学术目的,“穷人的主张”function可能是这样的:
var assert = function(condition, message) { if (!condition) throw Error("Assert failed" + (typeof message !== "undefined" ? ": " + message : "")); }; assert(1===1); // executes without problem assert(false, "Expected true"); // yields "Error: Assert failed: Expected true" in console
assert()
不是原生的JavaScript函数。 这是一个自定义的function。 你将不得不在你的页面或你的文件中find它,并发布给任何人来帮助确定它在做什么。
检查这个: http : //net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/
它用于testingJavaScript。 令人惊讶的是,这些代码只有五六行,在testing时提供了很高的权力和对代码的控制。
assert函数接受两个参数:
结果:一个布尔值,它引用你的testing通过还是失败
描述:testing的简短描述。
assert函数然后简单地创build一个列表项,根据你的testing是返回true还是false来应用一个“pass”或者“fail”的类,然后把描述追加到列表项中。 最后,该编码块被添加到页面。 这很简单,但完美的作品。
这是一个非常简单的assert函数的实现。 它需要一个值和描述你正在testing的东西。
function assert(value, description) { var result = value ? "pass" : "fail"; console.log(result + ' - ' + description); };
如果该值评估为true,则通过。
assert (1===1, 'testing if 1=1');
如果返回false,则失败。
assert (1===2, 'testing if 1=1');
它可能带有一些代码正在使用的testing库。 下面是一个例子(很可能它和你的代码不一样,但是它显示了一般的想法):
如果断言是错误的,则显示消息。 具体而言,如果第一个参数为false,则第二个参数(string消息)将被logging在开发人员工具控制台中。 如果第一个参数是真的,基本上没有任何反应。 一个简单的例子 – 我使用Google Developer Tools:
var isTrue = true; var isFalse = false; console.assert(isTrue, 'Equals true so will NOT log to the console.'); console.assert(isFalse, 'Equals false so WILL log to the console.');
以前的答案可以在性能和兼容性方面得到改善。
如果Error
对象存在,请检查一次 ,如果不声明:
if (typeof Error === "undefined") { Error = function(message) { this.message = message; }; Error.prototype.message = ""; }
然后,每个断言将检查条件,并总是抛出一个Error
对象
function assert(condition, message) { if (!condition) throw new Error(message || "Assertion failed"); }
请记住,控制台不会显示实际的错误行号,而是显示对debugging无用的assert
函数的行。
如果你使用webpack,你可以使用node.js断言库 。 尽pipe他们声称它“不打算成为一个通用的断言库”,但对于临时断言来说似乎还不止于此,在节点空间中似乎也没有竞争者存在(Chai是为unit testing而devise的)。
const assert = require('assert'); ... assert(jqXHR.status == 201, "create response should be 201");
你需要使用webpack或者browserify才能使用它,所以显然这只有在你的工作stream中已经有用的时候才有用。
除了像console.assert或自己的其他选项,你可以使用不变的 。 它有几个独特的function:
- 它支持格式化的错误消息(使用
%s
说明符)。 - 在生产环境中(由Node.js或Webpack环境确定),错误消息是可选的,允许(略)更小的.js。