JavaScript中[...str.matchAll()]返回值类型:关联数组还是对象?
关于String.matchAll()扩展后结果的疑问解答
一、那些额外属性的具体含义
每个匹配结果(即外层数组中的每个元素)带的额外属性作用如下:
index:当前匹配片段在原字符串中的起始位置(数字类型)input:用于匹配的原始目标字符串groups:当正则表达式包含命名捕获组时,这个属性是一个对象,键为捕获组的名称,值为对应捕获到的内容;如果正则没有命名捕获组,该属性为undefinedindices:ES2022新增的属性,存储每个匹配项(包括捕获组)在原字符串中的起始和结束索引位置,结构和groups对应——如果有命名捕获组,会包含一个groups子对象,记录每个命名组的索引范围
二、返回值的类型:数组,而非PHP式关联数组
用扩展运算符[...matches]得到的是一个数组的数组:外层数组包含所有匹配结果,每个内层元素都是标准的JavaScript数组,但因为JS里数组本质是特殊的对象(继承自Array.prototype),所以可以在数组上附加额外的字符串键属性(也就是你看到的index、input这些)。
它和PHP的关联数组完全不同:PHP关联数组是允许字符串作为键的集合,而JS数组的核心是数值索引,附加的字符串属性只是数组对象的额外键值对,不会改变它作为数组的本质。
三、为何length属性能正常工作
内层的每个匹配结果确实是标准JS数组,length属性是数组原型自带的,其值由数组的最大数值索引+1决定——那些额外的字符串键属性只是挂在这个数组对象上的“附加数据”,不会干扰length的计算逻辑,所以length能正常返回匹配到的捕获项数量(比如你的示例中,正则有一个命名捕获组,所以每个匹配数组的length是2:索引0是整个匹配的字符串,索引1是捕获组的内容)。
内容的提问来源于stack exchange,提问作者xkeshav
相关产品推荐
相关产品推荐

