【问题标题】:Array.from() on IterableIterator seemingly mutates parameterIterableIterator 上的 Array.from() 似乎改变了参数
【发布时间】:2022-01-20 20:27:42
【问题描述】:

我对这个有点困惑。我的代码如下所示:

let matches = code.matchAll(/regex pattern/g);
if (!Array.from(matches).length) {
    matches = code.matchAll(/regex alt pattern/g);
    if (!Array.from(matches).length) return;
}

console.log(Array.from(matches));

我的目标是检查模式,如果没有找到,请检查替代模式。如果还是没有找到,我想返回,否则,我会用它做一些工作。

我的问题是 Array.from(matches) 出于某种原因消耗了 matches。假设第一个正则表达式模式返回一个结果。 if 语句将被正确跳过,但控制台日志将打印出一个空数组。 matches 中没有任何内容。替代正则表达式也是如此。如果我检查是否提前返回,matches 将再次为空。但是,如果我将其注释掉,则该控制台日志有一个非空数组。

根据 MDN,Array.from() 应该进行浅拷贝。为什么要删除该引用?

【问题讨论】:

  • 我不想回答这个问题,因为我不能 100% 确定 JS 中的这种行为。但是,理论上 Array.from() 将需要迭代您的迭代器,这将改变它。如果这是正确的,那么这实际上是预期的行为。尝试仅使用 Array.from(code.matchAll(...)) 返回的值,这样您就只使用该迭代器一次。
  • 据此:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…matchAll() 的返回值是“匹配的迭代器(不是可重新启动的迭代器)。”因此,当您使用 array.from() 对其进行迭代时,它会被消耗掉。 if 语句中的 array.from() 正在使用它。
  • 如果你阅读了关于 .matchAll() 返回的 MDN 文档,它是一个不可重启的迭代器。所以,Array.from() 会消耗它是正确的。你不能那样做代码。也许做Array.from(matches) 并将它保存到一个变量中,这样你就不需要再次使用迭代器了。
  • 我认为这不算“重启”,好吧。我应该怎么做,每次我想检查值时都复制一份?
  • 执行Array.from(matches) ONCE 并将其保存到变量中。然后,您可以在需要时使用数组数据或变量的长度,而无需尝试重​​用可迭代对象。

标签: javascript node.js arrays


【解决方案1】:

如果您阅读了关于 .matchAll() 返回的 MDN 文档,则它是一个不可重新启动的迭代器。所以,你是正确的 Array.from() 会消耗它,你显然不能再次使用那个迭代器。

所以,执行一次Array.from(matches) 并将其保存到一个变量中,这样您就不会尝试多次使用可迭代对象。这是一种方法:

let matches = Array.from(code.matchAll(/regex pattern/g));
if (!matches.length) {
    matches = Array.from(code.matchAll(/regex alt pattern/g));
    if (!matches.length) return;
}

console.log(matches);

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多