什么是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库。 下面是一个例子(很可能它和你的代码不一样,但是它显示了一般的想法):

http://chaijs.com/guide/styles/#assert

如果断言是错误的,则显示消息。 具体而言,如果第一个参数为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。