对于空字符串,JavaScript split为数组大小1而不是零

时间:2015-11-04 07:48:49

标签: javascript node.js split

我想用逗号分割字符串以获取Node.js中的数组。

exports.test = function(rq, rs){

   var mailList = "sharan@test.com,pradeep@test.com";
   var arrayList = mailList.split(",");    
   console.log(mailList + " array lenght " + arrayList.length );

   mailList = "";
   arrayList = mailList.split(",");
   console.log(mailList + " array lenght " + arrayList.length );

   mailList = "sharan@test.com,";
   console.log(mailList + " array lenght " + arrayList.length );

   mailList = ",";
   console.log(mailList + " array lenght " + arrayList.length );

   rs.send("test here ");

}

控制台输出是:

sharan@test.com,pradeep@test.com array lenght 2
array lenght 1
sharan@test.com, array lenght 1
, array lenght 1

为什么JavaScript "".split()返回一个包含一个元素而不是空数组的数组?

2 个答案:

答案 0 :(得分:2)

返回的数组包含一个空字符串([""])。它以这种方式工作,因为直到第一个匹配(或字符串结尾)的所有内容都作为数组的第一个元素返回。在空字符串的情况下,这是一个空字符串。

如果您考虑分割算法的实现方式可能如何,这是有道理的。可能你从一个包含当前元素的空字符串开始,然后循环遍历字符串的字母,将它们添加到当前元素,直到到达字符串末尾或分隔符。然后将当前元素推送到结果数组。

如果您的长度为零的字符串,则以当前元素的空字符串开头。你直接到达最后,所以你将空字符串推送到结果数组并返回它。

这也是应该如何运作的。来自ECMAScript Language Specification

  

如果此对象是(或转换为)空String,则结果取决于分隔符是否可以匹配空String。如果可以,结果数组不包含任何元素。否则,结果数组包含一个元素,即空字符串。

来自Mozilla

  

找到后,将从字符串中删除分隔符,并在数组中返回子字符串。如果未找到separator或省略,则该数组包含一个由整个字符串组成的元素。

  

注意:当字符串为空时,split()返回一个包含一个空字符串的数组,而不是一个空数组。

如果你不喜欢这种行为,你可以为自己的版本制作原型:

//Return an empty array if string is empty.
//Otherwise return the result of the ordinary split.
String.prototype.split2 = function(separator) {
    return this == "" ? [] : this.split(separator);
}

答案 1 :(得分:1)

第一个匹配前的所有内容都作为第一个元素返回。即使字符串为空。它不是空的

如果你想拆分并返回0长度数组,我建议你使用underscore.string modulewords方法:

_str.words("", ",");
// => []

_str.words("Foo", ",");
// => [ 'Foo' ]