我看到有一个阵列定义为[,EL1,EL2],我从来没有见过这样定义的数组。如果我这样定义的方式,是指第一个元素是取消定义?
const targetItems = [1, 2, 3, a, b, c].map( items=>{
const matches = itmes.match([a-z])
const [, targetItems , remainItems] = matches
})
在这种情况下,比赛应该be[a, b, c]
,但最终阵列应该是什么样子?
这是一个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需要一个正则表达式作为参数,即使类型强制它将使不及义相对于一个正则表达式错字的代码。
然而,即使在这种情况下,代码将无法正常工作,因为match
会返回一个元素,使得整个解构没用 - 返回的唯一元素是一个丢弃。此外,它会返回只有一个字母。
相信原代码会略有不同(例如具有用于正则表达式一个全局标志,和/或一些量词,例如“+”);所以这是很难搞清楚什么是从提供的代码的最终结果。
该生产线
const [, targetItems, remainItems] = matches
不创建(或“定义”)的阵列。它destructures阵列成单个变量(当然,在这种情况下的常数)。这相当于:
const targetItems = matches[1];
const remainItems = matches[2];
由于是在第一位置([
之后和之前的,
)无标识的名称,第一个条目(matches[0]
)不存储。
这就是所谓的数组解构。 (JavaScript的也有对象解构。)
......最终的阵列应该是什么样子?
在该代码,targetItems
将是一个六进入阵列包含值undefined
所有条目因为map
回调从不返回一个值,因此调用它导致undefined
。回调应该使用return
返回一个值(或使用其隐含的回报箭头函数的形式简洁,但它不能做到这一点与声明中的话)。
作为ZER0 points out,虽然,它是现代的JavaScript有效的数组初始化离开了条目:
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
上itmes
(原文如此)。我认为生产线的在某些时候得到了乱码...