Javascript 关于数组高阶函数的正则表达式全局搜索问题

Javascript 关于数组高阶函数的正则表达式全局搜索问题,javascript,regex,Javascript,Regex,嗯……问题是为什么启用全局搜索时,我们没有得到想要的结果。预期的结果应该是 let phoneNums = ["801-766-9754", "801-545-5454", "435-666-1212", "801-796-8010", "435-555-9801", "801-009-0909", "435-222-8013", "801-777-66553", "801-777-665-", "801-77A-6655", "801-778-665"]; let regEx = /801-

嗯……问题是为什么启用全局搜索时,我们没有得到想要的结果。预期的结果应该是

let phoneNums = ["801-766-9754", "801-545-5454", "435-666-1212", "801-796-8010", "435-555-9801", "801-009-0909", "435-222-8013", "801-777-66553", "801-777-665-", "801-77A-6655", "801-778-665"];

let regEx = /801-/g, 
    newArray = []
newArray = phoneNums.map(elem => regEx.test(elem));
console.log(newArray);
但如果启用了全局搜索或g标志,则结果是

​[ true, true, false, true, false, true, false, true, true, true, true]

所以我只是想知道为什么会这样?

这是因为JavaScript正则表达式是有状态的

调用
test
时,它会更改正则表达式的状态(将其提前到匹配结束)。当您第二次调用它时(在数组的下一个元素上),它会尝试从上一个匹配的末尾开始搜索。它的结果为false,因为在第一次匹配之后没有更多的匹配

这可以通过以下简单代码进行演示:

let phoneNum=“801-545-5454”;
设regEx=/801-/g;
log(regEx.test(phoneNum));

log(regEx.test(phoneNum))这是因为JavaScript正则表达式是有状态的

调用
test
时,它会更改正则表达式的状态(将其提前到匹配结束)。当您第二次调用它时(在数组的下一个元素上),它会尝试从上一个匹配的末尾开始搜索。它的结果为false,因为在第一次匹配之后没有更多的匹配

这可以通过以下简单代码进行演示:

let phoneNum=“801-545-5454”;
设regEx=/801-/g;
log(regEx.test(phoneNum));

log(regEx.test(phoneNum))
查看您的预期结果,您正在查找字符串开头匹配的内容,您可以使用
startsWith('801-')
/^801-/
查看您的预期结果,您正在查找字符串开头匹配的内容,您可以使用
startsWith('801-'))
/^801-/
IMO
g
在上一个示例中没有意义,它可以安全地删除,因为测试结果是布尔值,因此即使它匹配一次或多次,也不会产生任何差异,您的答案可以解释实际问题+1@CodeManiac是 啊good point.IMO
g
在上一个示例中没有意义,它可以安全地删除,因为测试结果是布尔值,所以即使它匹配一次或多次,也不会有任何区别,您的答案可以解释实际问题+1@CodeManiac是的,很有道理。
[ true, false, false, true, false, true, false, true, false, true, … ]