断言在JavaScript中是什么意思?
我见过这样的情况:
assert(function1() && function2() && function3(), "some text");
并且想知道assert()方法做什么。
断言在JavaScript中是什么意思?
我见过这样的情况:
assert(function1() && function2() && function3(), "some text");
并且想知道assert()方法做什么。
JavaScript本身没有标准的断言。也许你使用的库提供了这样的功能;例如,如果你在使用Node.js,也许你在使用断言模块。(提供实现控制台API的控制台的浏览器和其他环境提供console.assert。)
assert函数的通常含义是,如果传入函数的表达式为false,则抛出一个错误;这是断言检查一般概念的一部分。通常断言(正如它们所称)只在“测试”或“调试”构建中使用,并从生产代码中剥离出来。
假设有一个函数总是接受字符串。你会想知道是否有人用不是字符串的东西(没有像TypeScript或Flow这样的类型检查层)调用了这个函数。你可能会这样做:
assert(typeof argumentName === "string");
...如果条件为假,assert将抛出错误。
一个非常简单的版本是这样的:
function assert(condition, message) {
if (!condition) {
throw message || "Assertion failed";
}
}
更好的是,利用Error对象,它具有收集堆栈跟踪的优点,例如:
function assert(condition, message) {
if (!condition) {
throw new Error(message || "Assertion failed");
}
}
它可能与您的某些代码正在使用的测试库一起提供。这里有一个例子(它可能与你的代码使用的库不同,但它显示了一般的思想):
http://chaijs.com/guide/styles/#assert
检查:http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/
它是用来测试JavaScript的。令人惊讶的是,这段代码只有五六行,在测试时提供了强大的功能和对代码的控制。
assert函数接受两个形参:
outcome:一个布尔值,它引用您的测试是通过还是失败
描述:测试的简短描述。
assert函数然后简单地创建一个列表项,应用一个“pass”或“fail”的类(取决于您的测试返回的是真还是假),然后将描述追加到列表项。最后,该编码块被添加到页面中。这是疯狂的简单,但工作完美。
如果使用现代浏览器或nodejs,则可以使用console。断言(表情,对象)。
欲了解更多信息:
Chrome API参考 Firefox Web控制台 Firebug控制台API IE控制台API 歌剧蜻蜓 Nodejs控制台API
其他答案很好:ECMAScript5中没有内置断言函数(例如,JavaScript基本上在任何地方都可以工作),但一些浏览器提供了断言函数或提供了提供该功能的附加组件。虽然最好使用一个完善的/流行的/维护的库,但出于学术目的,“穷人的断言”函数可能是这样的:
const assert = function(condition, message) {
if (!condition)
throw Error('Assert failed: ' + (message || ''));
};
assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in 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");
}
请记住,控制台不会显示真正的错误行号,而是assert函数的行号,这对调试没有用处。
如果断言为假,则显示该消息。具体来说,如果第一个参数为假,则第二个参数(字符串消息)将被记录在开发人员工具控制台中。如果第一个参数是正确的,基本上什么都不会发生。一个简单的例子-我使用谷歌开发工具:
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.');
如果你使用webpack,你可以只使用node.js断言库。尽管他们声称它“并不是一个通用的断言库”,但它对于特别的断言似乎已经足够了,而且在Node领域似乎没有竞争对手(Chai是为单元测试而设计的)。
const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");
你需要使用webpack或browserify才能使用它,所以很明显,这只在那些已经在你的工作流中才有用。
除了其他选项,如控制台。断言或滚动您自己的,您可以使用不变式。它有几个独特的特点:
它支持格式化的错误消息(使用%s说明符)。 在生产环境中(由Node.js或Webpack环境决定),错误消息是可选的,允许(稍微)较小的.js。
单词或函数“assert”主要用于应用程序的测试部分。
断言函数是指示程序检查条件(也称为“断言”)的一种简短方式,如果条件不为True,它将抛出错误。
让我们看看它在"普通代码"中是怎样的
If (typeof "string" === "array") { 抛出错误('错误:"string" !== "array"'); }
使用assert你可以简单地写:
Assert (typeof "string" === "array")
在Javascript中,没有本地断言函数,所以你必须使用某个库中的断言函数。
简单介绍,可以查看这篇文章:
http://fredkschott.com/post/2014/05/nodejs-testing-essentials/
我希望这能有所帮助。
正如t.j.所提到的,JavaScript中没有断言。 但是,有一个名为assert的节点模块,主要用于测试。所以,你可能会看到这样的代码:
const assert = require('assert');
assert(5 > 7);
如果第一个属性为假,断言将抛出错误消息,而第二个属性是要抛出的消息。
console.assert(condition,message);
有很多评论说断言在JavaScript中不存在,但console.assert()是JavaScript中的断言函数 断言的思想是找出错误发生的原因/位置。
console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");
在这里,您可以根据消息找到错误是什么。 这些错误消息将以红色显示到控制台,就像我们调用了console.error();
你可以使用断言来测试你的函数,例如:
console.assert(myAddFunction(5,8)===(5+8),"Failed on 5 and 8");
注意,条件可以是!= < >等
这通常用于通过提供一些测试用例来测试新创建的函数是否按预期工作,而不是用于生产。
要查看控制台中的更多函数,请执行console.log(console);
Java有一个断言语句,JVM默认禁用断言验证。它们必须使用命令行参数-enableassertions(或其简写-ea)显式启用,
虽然JavaScript支持console.assert(),但它只是一个日志方法,如果断言失败也不会中断当前过程。
为了把东西放在一起并满足各种需求,这里有一个小的js断言库。
globalThis.assert = (()=> { class AssertionError extends Error { constructor(message) { super(message); this.name = 'AssertionError'; } } let config = { async: true, silent: false }; function assert(condition, message = undefined) { if (!condition) { if (config.silent) { //NOOP } else if (config.async) { console.assert(condition, message || 'assert'); } else { throw new AssertionError(message || 'assertion failed'); } } } assert.config = config; return assert; })(); /* global assert */ Object.assign(assert.config, { // silent: true, // to disable assertion validation async: false, // to validate assertion synchronously (will interrupt if assertion failed, like Java's) }); let items = [ {id: 1}, {id: 2}, {id: 3} ]; function deleteItem(item) { let index = items.findIndex((e)=> e.id === item.id); assert(index > -1, `index should be >=0, the item(id=${item.id}) to be deleted doesn't exist, or was already deleted`); items.splice(index, 1); } console.log('begin'); deleteItem({id: 1}); deleteItem({id: 1}); console.log('end');
Node.js有一个assert函数,你可以导入:
Const assert = require('assert')
正如人们所期望的那样,assert(false)抛出一个错误,assert(false, message)抛出一个带有消息的错误。
其他答案已经指出JS本身没有本机断言函数,在撰写本文(2021年4月)时仍然如此。
Chrome开发工具支持console.assert 你可以打开devtools并在devtools-source-navigator- snippets中创建一个代码段。然后写一些代码……并运行代码片段…