对“RexExp.prototype.exec”的返回值类型感到困惑



我发现RexExp.prototype.exec的返回值很奇怪。返回的数组还包含键值对。

> RegExp('foo*','g').exec('table football, foosball')
[ 'foo',
  index: 6,
  input: 'table football, foosball',
  groups: undefined ]

并且返回的值可以通过Array.isArray测试,如果传递给typeof将返回object

> Array.isArray(RegExp('foo*','g').exec('table football, foosball'))
true
> typeof RegExp('foo*','g').exec('table football, foosball')
'object'

那么它是什么类型呢?

它是一个与键值对关联的数组吗?喜欢这个:

> var arr = [1]
undefined
> arr.aaa = 2
2
> arr.bbb = 3
3
> arr
[ 1, aaa: 2, bbb: 3 ]

它是一个与键值对关联的数组吗?

这是完全正确的。它是一个普通数组,已被分配了某些附加属性。由于数组是对象,除了通常的数字指示外,它们还可以具有任意键值对,尽管您几乎永远不会在普通的干净代码中看到这一点(正则表达式匹配是我能想到的唯一例外数组对象具有额外的非标准属性(。

(旁注:为了避免在正则表达式中双重转义(常见(反斜杠,请考虑一直使用正则表达式文字,并且仅在需要从变量动态创建模式时才使用new RegExp,例如const pattern = new RegExp('foo' + myVar + 'bar')(

最新更新