在JS中定义第一个元素为空的数组

时间:2019-02-12 10:17:58

标签: javascript arrays

我看到有一个数组被定义为[,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],但最终数组应为什么样?

2 个答案:

答案 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])

假设itmesitems的错字,我还假设items.match([a-z])实际上是items.match(/[a-z]/),因为否则就没有意义了– match以regexp为参数,即使使用类型强制,与regexp错字相比,代码的意义也较小。

但是,即使在那种情况下,代码也无法工作,因为match将仅返回一个元素,从而使整个销毁过程变得无用–返回的唯一元素是被丢弃的元素。另外,它只会返回一个字母。

我相信原始代码会稍有不同(例如,具有用于正则表达式的全局标志和/或某些量词,例如“ +”);因此很难从所提供的代码中找出最终结果。