295

assert在 JavaScript中是什么意思?

我见过类似的东西:

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

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

4

17 回答 17

416

JavaScript 本身没有标准assert。也许您正在使用一些提供的库;例如,如果您使用的是 Node.js,那么您可能正在使用断言模块。(提供实现控制台 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");
    }
}
于 2013-03-09T17:01:39.130 回答
167

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

了解更多信息:

于 2013-06-11T21:28:01.070 回答
34

其他答案很好: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
于 2013-06-28T17:12:28.717 回答
10

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

于 2013-03-09T17:01:50.017 回答
7

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

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

assert 函数接受两个参数:

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

描述:您的测试的简短描述。

然后 assert 函数简单地创建一个列表项,根据您的测试返回 true 或 false 应用“通过”或“失败”类,然后将描述附加到列表项。最后,将该代码块添加到页面中。这非常简单,但效果很好。

于 2013-03-09T17:07:12.650 回答
6

如果断言为假,则显示消息。具体来说,如果第一个参数为 false,则第二个参数(字符串消息)将记录在开发人员工具控制台中。如果第一个参数为真,则基本上什么都不会发生。一个简单的例子——我正在使用谷歌开发者工具:

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.');
于 2016-01-06T20:50:10.723 回答
4

它可能带有您的某些代码正在使用的测试库。这是一个示例(可能与您的代码使用的库不同,但它显示了总体思路):

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

于 2013-03-09T17:05:45.030 回答
4

单词或函数“assert”主要用于测试应用程序的部分。

断言函数是指示程序检查条件(也称为“断言”)的一种简短方法,如果条件不为真,它将抛出错误。

所以让我们看看它在“普通代码”中的样子

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

assert可以简单地写:

assert(typeof "string" === "array")

在 Javascript 中,没有本机assert函数,因此您必须使用某个库中的一个。

简单介绍可以查看这篇文章:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

我希望它有所帮助。

于 2018-09-28T08:55:50.907 回答
4

如果第一个属性为假,则断言抛出错误消息,第二个属性是要抛出的消息。

console.assert(condition,message);

有很多评论说 JavaScript 中不存在断言,而是 JavaScriptconsole.assert()中的断言函数 断言的想法是找出错误发生的原因/位置。

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);

于 2020-03-02T17:46:15.643 回答
3

Java有一个assert声明,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');

于 2021-02-24T08:41:22.147 回答
2

可以在性能和兼容性方面改进以前的答案。

检查一次对象是否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函数的行,这对调试没有用处。

于 2015-02-16T20:58:35.110 回答
2

如果你使用 webpack,你可以只使用node.js 断言库。尽管他们声称它“不打算成为一个通用的断言库”,但对于临时断言来说似乎还不错,而且在 Node 空间中似乎不存在任何竞争对手(Chai 是为单元测试而设计的)。

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

您需要使用 webpack 或 browserify 才能使用它,因此显然这仅在您的工作流程中已经存在时才有用。

于 2016-04-08T14:41:29.517 回答
2

除了console.assert自己滚动等其他选项之外,您还可以使用invariant。它有几个独特的功能:

  • 它支持格式化的错误消息(使用%s说明符)。
  • 在生产环境中(由 Node.js 或 Webpack 环境确定),错误消息是可选的,允许(稍微)较小的 .js。
于 2016-05-02T19:02:15.863 回答
1

正如 TJ 所说,assertJavaScript 中没有。但是,有一个名为assert的节点模块,主要用于测试。因此,您可能会看到如下代码:

const assert = require('assert');
assert(5 > 7);
于 2019-02-14T12:21:21.077 回答
1

Node.js 实际上有一个可以导入的断言函数。

const assert = require('assert')

它的工作方式完全符合人们的预期,即assert(false)抛出一个错误,并assert(false, message)抛出一个带有消息的错误。

其他答案已经指出 JS 本身没有本机断言函数,并且在撰写本文时(2021 年 4 月)仍然如此。

于 2021-04-05T18:17:21.133 回答
0

assert()是 JavaScript 中的断言函数。断言的主要思想是找出错误发生的原因/位置。

于 2022-02-09T09:01:01.377 回答
-1

Chrome devtools 支持console.assert 您可以打开 devtools 并在 devtools-source-navigator-Snippets 中创建一个片段。并编写一些代码......并运行代码片段......

于 2022-03-02T08:46:10.820 回答