这个数组如何连接产生字符串?

时间:2016-09-03 17:48:15

标签: javascript

CodeWars的一个问题是编写一个函数accum(s),它执行以下操作:

accum("abcd");    // "A-Bb-Ccc-Dddd"
accum("RqaEzty"); // "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
accum("cwAt");    // "C-Ww-Aaa-Tttt"

这个问题的答案如下:

function accum(s) {
  return s.split('').map((x,index) => x.toUpperCase()+Array(index+1).join(x.toLowerCase())).join('-');
}

我对x.toUpperCase()+Array(index+1).join(x.toLowerCase())的所作所为特别感兴趣。

如果我将其分片,Array输出[]Array(1)输出[ ]Array(2)输出[ , ]。这看起来很奇怪。

更奇怪的是,'a' + Array()输出a'a' + Array(1)看似输出a'a' + Array(2)输出a,'a' + Array(3)输出a,,。请注意,尖括号已消失。即,它不是一个数组。再次,这似乎......很奇怪。

更好的是,'a' + Array() + 'b'输出a'a' + Array(1) + 'b'输出a'a' + Array(2) + 'b'输出ab

我的问题是,是否有人可以解释所有这三种情况中发生的事情。在第一种情况下,为什么似乎有一个空格从Array()添加到Array(1)?为什么Array(2)不会输出[,],而是[ , ]

当一封信与Array(n)连在一起时会发生什么?在这种情况下Array(n)返回了什么内容?

1 个答案:

答案 0 :(得分:3)

这是有效的,因为它创建的数组具有一定数量的元素,默认情况下为undefined,然后使用字母作为分隔符连接它们。

想想如果你用逗号分隔符加入一个空字符串数组会是什么样的:



// join with blank delimiter
console.log(['A', 'B', 'C'].join(''));

// join with comma delimiter
console.log(['A', 'B', 'C'].join(','));

// join blank strings with comma delimiter
console.log(['', '', ''].join(','));

// join blank strings with letter delimiter
console.log(['', '', ''].join('a'));

// join undefined with letter delimiter
console.log([undefined, undefined, undefined].join('a'));

// join array of undefined with letter delimiter
console.log(Array(3).join('a'));




请注意,数组中的最后一个元素没有得到分隔符,因此与数组长度相比,结果总是会少一个字符。这就是为什么他们使用Array(index+1)来增大临时数组以容纳额外的分隔符。