我看到有一个数组被定义为[,el1,el2],我从未见过这种定义数组的方法。如果我这样定义,是否意味着第一个元素未定义?
const targetItems = [1, 2, 3, a, b, c].map( items=>{
const matches = itmes.match([a-z])
const [, targetItems , remainItems] = matches
})
在这种情况下,匹配项应为[a, b, c]
,但最终数组应为什么样?
答案 0 :(得分:5)
行
const [, targetItems, remainItems] = matches
不创建(或“定义”)数组。它destructures将数组组成单个变量(在这种情况下为常量)。等效于:
const targetItems = matches[1];
const remainItems = matches[2];
由于第一个位置(在[
之后和,
之前没有标识符名称,因此第一个条目(matches[0]
)不会存储在任何地方。
这称为数组解构。 (JavaScript还具有对象解构。)
...最终的数组应该是什么样的?
在该代码中,targetItems
将是一个六项数组,所有条目都包含值undefined
,因为map
回调永远不会返回值,因此调用它会导致{{ 1}}。回调应使用undefined
返回一个值(或使用带有隐式返回的箭头函数的简洁形式,但不能使用其中的语句来做到这一点)。
不过,与ZER0 points out一样,在现代JavaScript中,在数组初始值设定项中省略条目是有效的:
return
这不是问题中的代码正在执行的操作,但是解构的一大优点是其语法是数组解构语法与数组初始值设定项(“文字”)完全一样语法和对象解构语法与对象初始化程序(“ literal”)语法完全相同。只是当它在赋值的右侧(或在参数列表中)时,它正在破坏现有的数组/对象而不是创建一个数组。
此行高度可疑:
const a = [ , "one", "two", , "four"];
console.log(a.length); // 5
console.log(a[0]); // undefined
console.log(0 in a); // false (because there's no entry at all)
console.log(a[1]) // "one"
console.log(1 in a); // true
它期望有两个范围内的标识符const matches = itmes.match([a-z])
和a
,然后从z
中减去z
并使用结果值创建一个数组,然后将该数组传递到a
上的match
中(原文如此)。我认为该行在某些时候出现了乱码...
答案 1 :(得分:3)
这是一个destructuring assignment不是数组声明。这段代码:
const [, targetItems , remainItems] = matches
等效于:
const targetItems = matches[1]
const remainItems = matches[2]
基本上,您将创建两个变量,将它们绑定到数组中第二个和第三个元素的值。使用逗号,因此您可以跳过不需要的元素。您还可以使用传播语法,例如:
const [, x, , y, ...end] = ['a','b','c','d','e', 'f']
console.log(x) // "b"
console.log(y) // "d"
console.log(end) // ["e", "f"]
请说,您当然也可以创建带有空插槽的阵列:
const arr = [, 10];
在这种情况下,匹配项应为[a,b,c],但最终数组应为什么样?
在您发布的代码中,数组函数没有return
(使用方括号,因此需要该语句),因此数组将被映射到每个元素的undefined
。
更新
const matches = itmes.match([a-z])
假设itmes
是items
的错字,我还假设items.match([a-z])
实际上是items.match(/[a-z]/)
,因为否则就没有意义了– match以regexp为参数,即使使用类型强制,与regexp错字相比,代码的意义也较小。
但是,即使在那种情况下,代码也无法工作,因为match
将仅返回一个元素,从而使整个销毁过程变得无用–返回的唯一元素是被丢弃的元素。另外,它只会返回一个字母。
我相信原始代码会稍有不同(例如,具有用于正则表达式的全局标志和/或某些量词,例如“ +”);因此很难从所提供的代码中找出最终结果。