正则表达式的exec()方法为什么返回布尔类型?

3
我对 JavaScript 比较陌生,遇到了正则表达式的问题。
根据这个文档(链接) ,regex.exec() 函数应该返回一个数组或者 null 如果匹配失败。
引用如下: “如果匹配成功,exec() 方法会返回一个数组并更新正则表达式对象的属性。返回的数组第一项是匹配到的字符串,后面每一项就是括号内匹配到的字符串。 如果匹配失败,则 exec() 方法返回 null。”
那么为什么在我的代码中,exec() 的结果要么是一个布尔值,要么就是 null?
function matchHTMLsymbols(str)
  var pattern = /&|<|>|"|' /g;
  var arr;
  while ((arr = pattern.exec(str) !== null)) {
    console.log(arr);
    }
}

1
"!==" 比 "=" 优先级高。" - ibrahim mahrir
2个回答

6

因为 arr 不是 exec 的结果,而是 !== 的结果(应该是 true 或者 false)。

换句话说,x = y !== z 的解析方式是 x = (y !== z),而不是 (x = y) !== z

你可能想要写成

while ((arr = pattern.exec(str)) !== null) {

而不是。


3
值得注意的是,由于所有的数组都是真值,因此可以简化为 while(arr = pattern.exec(str)),整个问题就不复存在了。 - Niet the Dark Absol

0

您应该在您的while循环中添加一对括号:

function matchHTMLsymbols(str) {
  var pattern = /&|<|>|"|' /g,
      arr;
      
  while (((arr = pattern.exec(str)) !== null)) {
    console.log(arr);
  }
}

matchHTMLsymbols('foo<bar"baz&');


看看melpomene的回答,再看看你的回答。回到melpomene的回答。你的回答不是melpomene的回答。但是别担心,如果你像melpomene一样花点时间解释为什么需要改变,那么你也可能会像melpomene一样获得赞和得分。 - Niet the Dark Absol
实际上,当我发布这个答案时,melpomene的答案中没有 while ((arr = pattern.exec(str)) !== null) { 这一行代码... - Badacadabra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接