使用字符串分割代替声明包含子字符串的数组

13

我经常注意到人们在将一个字符串拆分成子字符串时,而不是声明一个包含所需字符串的数组。

例如,在moment.js中的示例:

langConfigProperties = 'months|monthsShort|weekdays|weekdaysShort|weekdaysMin|longDateFormat|calendar|relativeTime|ordinal|meridiem'.split('|'),

jQuery中的示例。

 "Boolean Number String Function Array Date RegExp Object".split(" ")

为什么要选择这种方式?


我这样做是为了避免匹配数组声明中所有引号。 - Subir Kumar Sao
3
这个不适合在Stack Overflow上发布。简短回答:缩小代码体积。这些库被压缩成最小化的版本,空格减少到最少并且变量名很短。事实证明,使用拆分比编写数组字面量更短(字符计数)。 - Mattias Buelens
10
@MattiasBuelens 我很难理解为什么这不是适合在SO上讨论的话题。 - lonesomeday
1
这绝对属于SO。 - Gerard Simpson
1个回答

15

使用 .split 是更慢的,但是它有一个优点,代码可以更短(字符更少):


It's way slower to use the .split, but it has the advantage that the code can be shorter (Less characters):
var array = 'months|monthsShort|weekdays|weekdaysShort|weekdaysMin|longDateFormat|calendar|relativeTime|ordinal|meridiem'.split('|');
var array = ['months','monthsShort','weekdays','weekdaysShort','weekdaysMin','longDateFormat','calendar','relativeTime','ordinal','meridiem'];

在这个例子中,差别不是很大,但如果你有100个变量,差异就更加明显。

用分隔符进行拆分版本的长度增加量为11 + 1 * n,其中 n 是元素的数量,11 是由于使用 .split('|') 而产生的。
对于数组版本,则为 2 + 3 * (n - 1)2 是由于使用了 []

这意味着一旦你有6个元素,.split 版本就会更短:

for(var i = 5; i < 8; i++){
    console.log('Elements:', i, 'split:', 11 + (i-1), 'array:', 2 + 3 * (i-1));
}
// Elements: 5 split: 15 array: 14
// Elements: 6 split: 16 array: 17
// Elements: 7 split: 17 array: 20

1
仍然很惊奇地发现,平均而言,浪费时间在计算上比下载源代码更好。我本以为会相反。 - Dreen
@Dreen,可以这样想:考虑到大量使用jQuery的用户,对于更受欢迎的库来说,每个字节都很重要。(因此,这更多是一种服务器端优化,而不是客户端) - Cerbrus
1
@Dreen 有点晚了,但根据链接的 jsperf,在我的电脑上,较慢的方法只比较快的方法慢了0.000005 毫秒。不仅“浪费”可以忽略不计,即使是最快的互联网连接也无法在那么短的时间内下载一字节的数据,因此总体上它仍然更快。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接