JavaScript 中的“断言”是什么?

IT技术 javascript assert
2021-02-19 15:46:04

assert在 JavaScript什么意思?

我见过类似的东西:

assert(function1() && function2() && function3(), "some text");

并想知道该方法的assert()作用。

6个回答

assertJavaScript 本身没有标准也许你正在使用一些提供一个的库;例如,如果您使用的是 Node.js,那么您可能正在使用断言module(提供控制台实现控制台 API 的浏览器和其他环境提供console.assert.)

assert函数的通常含义是如果传入函数的表达式为假则抛出错误;这是断言检查的一般概念的一部分通常断言(正如他们所说的那样)仅用于“测试”或“调试”构建并从生产代码中剥离出来。

假设您有一个应该始终接受字符串的函数您想知道是否有人使用不是字符串的内容调用了该函数(没有像 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");
    }
}
@machineghost:我不明白这有多“简单”,你刚刚if换了一个条件运算符。无论如何,在当今世界,我不会费心支持没有Error.
2021-04-20 15:46:04
的东西,我已经添加到我的代码里面if(!condition)的设置var throwError=true;,然后debugger;再包裹扔节的if(throwError)这样,如果我打开调试器,它就会中断,如果我愿意,我可以设置throwError为 false,然后在退出时检查所有范围。
2021-05-08 15:46:04
@Rick 如果您使用 Chrome DevTools,您只需在 Sources 选项卡中启用“Pause on Uncaught Exceptions”,它就会在throw. 这样你就不需要debugger;声明了。有关更多信息,请参阅developer.chrome.com/devtools/docs/ ...。
2021-05-08 15:46:04
...对 JS 中的类型感到自卑?我认为这是最糟糕的原因之一assert
2021-05-16 15:46:04
@cHao:有有效的用例。这只是我想到的第一个例子。例子不是重点。断言的概念是重点。
2021-05-20 15:46:04

如果使用现代浏览器或 nodejs,您可以使用console.assert(expression, object).

想要查询更多的信息:

@DanielSokolowski,没错。console.assert不是那么好,除非它具有与throw.
2021-04-30 15:46:04
@Don:采取了点,但我只是从链接的页面中引用。我确实相信断言应该被视为可以被禁用,如果只是因为有一天你的代码可能会被认为这样做是安全的人使用。如果断言对您的代码至关重要,那么我认为它们确实应该升级到正确的错误检查,而不是依赖于并不总是保证终止执行的调试方法。更不用说让您的代码在生产环境中反复死亡,因为它可能只是返回错误并继续可能会导致比其value更大的压力!
2021-05-02 15:46:04
@RonBurk:语言设计者决定了“断言的意义”。C++ 中, [断言] 旨在捕获编程错误,而不是用户或运行时错误,因为它通常在程序退出调试阶段后被禁用。 PHP根据经验,如果断言检查未激活,您的代码应该始终能够正常工作。被动语态并不是要赋予个人偏好以权威,而是要报告被广泛接受的一般做法。
2021-05-07 15:46:04
之后继续执行的原因console.assert是断言不是错误处理函数。它们仅用于开发期间的代码正确性检查。传统上,它们在生产环境中被完全禁用,以避免实时系统因一些琐碎的事情而终止。浏览器被视为生产环境,因此console.assert不会在那里终止执行。如果您依赖断言来停止执行,那么您应该改用正确的错误处理,因为这不是断言的目的。
2021-05-17 15:46:04
仅供参考,这更像console.error是代码继续执行。
2021-05-20 15:46:04

其他答案很好: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
顺便说一句,人们可以很容易地修改它,以便它只在开发环境中引发错误(例如,通过包装另一个 if / 添加另一个条件),否则什么都不做或只打印警告。就我个人而言,我的观点是断言应该只在测试代码中(例如检查预期和实际结果是否匹配);在生产代码它们要么应多余的(通过设计保证正确的),从而去除或仅守卫在这种情况下,它们可通过消毒逻辑标准异常处理来代替用户/外部输入(例如trycatchthrow
2021-04-29 15:46:04
@jacobq 这不适合assert. 断言是一种契约,旨在通过程序的设计永远不会是假的。除了在测试中之外,捕获断言是错误的。这是可以捕获断言的唯一原因。您不能断言用户或客户端输入。将程序错误归咎于攻击者是没有意义的。即使是异常也会很糟糕,因为用户输入不是异常情况,也不是错误。这就像将程序错误归咎于用户/客户端。该原则与语言无关。只能归咎于处理不当或消毒不当。
2021-05-10 15:46:04
@ChrisoLosoph 你能澄清一下你认为不合适的地方吗?请注意,此实现是“穷人的断言”,即近似值,我并不是建议使用断言来代替异常处理或逻辑。我确实提到过,如果它们被用于保护输入之类的事情,那么还有其他可能更合适的替代方案(例如 if/else 逻辑或 try/catch 异常处理)。
2021-05-13 15:46:04
2021-05-15 15:46:04
我很抱歉造成混乱。我不是指您的回答,而是指您之前评论的最后一句话 :-) 。
2021-05-17 15:46:04

assert()不是原生的 javascript 函数。这是某人制作的自定义功能。您必须在您的页面或文件中查找它并将其发布给任何人以帮助确定它在做什么。

检查这个:http : //net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

它用于测试 JavaScript。令人惊讶的是,这段代码只有五六行,在测试时提供了强大的功能和对代码的控制。

assert 函数接受两个参数:

结果:一个布尔值,它引用您的测试是通过还是失败

描述:测试的简短描述。

然后 assert 函数简单地创建一个列表项,应用“通过”或“失败”的类,具体取决于您的测试返回的是真还是假,然后将描述附加到列表项。最后,该编码块被添加到页面中。这非常简单,但效果很好。