什么是JavaScript中的"断言"?

frr*_*lod 255 javascript assert

assertJavaScript 中的含义是什么?

我见过类似的东西:

assert(function1() && function2() && function3(), "some text");
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 353

assert在JavaScript 中没有(但是有关于添加一个讨论,但它处于早期阶段).也许你正在使用一些提供一个库的库.通常的意思是如果传递给函数的表达式为false则抛出错误; 这是断言检查的一般概念的一部分.通常断言(因为它们被称为)仅用于"测试"或"调试"构建并从生产代码中删除.

假设你有一个应该总是接受字符串的函数.你想知道是否有人用不是字符串的东西调用了那个函数.所以你可能会这样做:

assert(typeof argumentName === "string");
Run Code Online (Sandbox Code Playgroud)

... assert如果条件错误,将在哪里抛出错误.

一个非常简单的版本看起来像这样:

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的是,Error如果JavaScript引擎支持它,可以使用该对象(实际上可能不支持),这有利于收集堆栈跟踪等等:

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至IE8也有Error(虽然它没有stack属性,但现代引擎[包括现代IE] 都有).

  • @cHao:有一些有效的用例.这只是我想到的第一个例子.这个例子不是重点.断言的概念就是重点. (126认同)
  • ......对JS中的类型感到高兴吗?我认为这是"断言"的最糟糕理由之一. (6认同)
  • @Rick如果您使用Chrome DevTools,您只需在Sources选项卡中启用"Pause on Uncaught Exceptions",它将自动在`throw`处中断.这样你就不需要`debugger;`语句了.有关详细信息,请参阅https://developer.chrome.com/devtools/docs/javascript-debugging#pause-on-exceptions. (6认同)
  • 我在`if(!condition)`中添加到我的代码中的东西是设置`var throwError = true;`然后`debugger;`然后将throw部分包装在`if(throwError)`中.这样,如果我打开调试器,它就会中断,如果我愿意,我可以将`throwError`设置为false,然后在退出时检查所有范围. (4认同)

小智 153

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

欲获得更多信息:

  • 仅供参考,这更像是"console.error",代码继续执行. (40认同)
  • 在`console.assert`之后继续执行的原因是因为断言不是错误处理函数.它们仅用于开发期间的代码正确性检查.传统上,它们在生产环境中被完全禁用,以避免由于某些微不足道的事情而导致实时系统终止.浏览器被认为是一个生产环境,因此`console.assert`不会在那里终止执行.如果您依赖断言来停止执行,那么您应该使用正确的错误处理,因为这不是断言的意思. (18认同)
  • @DanielSokolowski,完全正确.`console.assert`不太好,除非它与`throw`具有相同的行为. (8认同)
  • @RonBurk:语言设计师决定"断言是什么意思".在[C++](http://www.cplusplus.com/reference/cassert/assert/)中,_ [断言]旨在捕获编程错误,而不是用户或运行时错误,因为它通常在程序后被禁用退出调试阶段._ [PHP](http://php.net/manual/en/function.assert.php)说_根据经验,如果未激活断言检查,您的代码应该始终能够正常工作. _被动的声音并不意味着赋予个人偏好权力,而是报告广泛接受的一般做法. (6认同)
  • @Don:点了,但我只是引用链接页面.我确实认为断言应该被视为可以被禁用,只是因为你的代码可能有一天会被那些认为安全的人使用.如果断言对您的代码至关重要,那么我认为它们确实应该升级到正确的错误检查,而不是依赖于并不总能保证终止执行的调试方法.更不用说让你的代码在生产环境中重复死亡,它只能返回一个错误而继续可能会造成比它更值得的压力! (4认同)
  • @Malvineous嗯,不,断言通常不是语言的一部分(例如C,c ++).断言是*概念*,而不是特定语言的特定发明.因此,"语言设计者"不会进入断言是什么或者"应该"使用什么的图片.语言设计师可以告诉你各种各样的事情,但他们并没有发明模块化,接口或任何与语言无关的概念.例如,请参阅第1版"C++编程语言",了解最新版本中的建议. (3认同)
  • @Malvineous “在 C++ 中,[断言] 旨在捕获编程错误,而不是用户或运行时错误,因为它通常在程序退出调试阶段后被禁用。” 不幸的是,这是一种流行的观点,它基于一种不切实际的假设,即调试阶段结束后,不再有编程错误,因此只需移除防护栏即可。这种观点并不是普遍持有的,对许多人来说确实是令人反感和恐惧的。因此,除非您想激怒人们,否则更谨慎地构建它可能会有所帮助。 (3认同)

iX3*_*iX3 27

其他答案都很好: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
Run Code Online (Sandbox Code Playgroud)


Cra*_*ent 8

assert()不是本机javascript函数.这是一个人做的自定义功能.您必须在您的页面或文件中查找它并将其发布给任何人以帮助确定它正在做什么.


Cra*_*Cat 6

如果断言为假,则显示该消息。具体来说,如果第一个参数为 false,则第二个参数(字符串消息)将记录在开发人员工具控制台中。如果第一个参数为真,则基本上什么也不会发生。使用 Google 开发者工具的简单示例 \xe2\x80\x93 I\xe2\x80\x99m:

\n\n
var isTrue = true;\nvar isFalse = false;\nconsole.assert(isTrue, 'Equals true so will NOT log to the console.');\nconsole.assert(isFalse, 'Equals false so WILL log to the console.');\n
Run Code Online (Sandbox Code Playgroud)\n


Amr*_*dra 5

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

它用于测试JavaScript.令人惊讶的是,在测试时,这段代码只有五到六行,可以为您的代码提供强大的功能和控制能力.

assert函数接受两个参数:

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

描述:测试的简短描述.

断言函数然后简单地创建一个列表项,应用"pass"或"fail"类,这取决于您的测试是返回true还是false,然后将描述附加到列表项.最后,将该编码块添加到页面中.这很简单,但效果很好.