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)
返回了什么内容?
答案 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)
来增大临时数组以容纳额外的分隔符。