JavaScript的split函数对于空字符串返回数组大小为1而不是0

12 浏览
0 Comments

JavaScript的split函数对于空字符串返回数组大小为1而不是0

为了在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()返回一个包含一个元素而不是空数组?

0
0 Comments

JavaScript的split方法是用来将字符串分割成子字符串,并将结果存储在一个数组中。然而,在某些情况下,split方法可能会返回一个长度为一的数组,而不是预期的零长度数组。

出现这个问题的原因是当split方法应用于空字符串时,它会返回一个包含一个空字符串元素的数组。这是因为在空字符串中没有分隔符,split方法会将整个字符串作为一个元素添加到结果数组中。

为了解决这个问题,可以通过检查split数组的第一个值是否为空来判断是否出现了这种情况。如果第一个值为空,那么整个字符串是一个空字符串,数组的长度应该为零。否则,数组的长度应该等于split后的结果数组的长度。

下面是一个用于解决这个问题的示例代码:

var arrayList = mailList.split(",");
if(arrayList[0] != ""){
  arrayLength = arrayList.length;
}else{
  arrayLength = 0;
}

在这个示例中,我们首先将字符串mailList使用逗号作为分隔符进行split操作,并将结果存储在数组arrayList中。然后,我们通过检查arrayList的第一个值是否为空来确定是否出现了空字符串的情况。如果第一个值不为空,我们将arrayList的长度赋值给arrayLength。如果第一个值为空,我们将arrayLength设置为零。

通过这种方式,我们可以正确地处理空字符串,并获取正确的数组长度。这样,我们就解决了JavaScript split方法在空字符串情况下返回长度为一的数组的问题。

0
0 Comments

JavaScript中的split方法在处理空字符串时会返回长度为1的数组,而不是长度为0的数组。这是因为split方法在返回结果时,会将第一个匹配项之前的内容作为第一个元素返回,即使字符串是空的也是如此。这里的空字符串并不是null。

如果你想要使用split方法并返回一个长度为0的数组,我推荐你使用underscore.string模块中的words方法:

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

underscore.string是一个JavaScript库,它提供了许多用于处理字符串的实用方法。其中的words方法可以将字符串按照指定的分隔符进行拆分,并返回一个数组。在处理空字符串时,该方法会返回一个长度为0的数组,满足你的需求。

0
0 Comments

JavaScript的split方法在处理空字符串时返回一个包含单个空字符串的数组。这样的设计是因为在第一个匹配项(或字符串末尾)之前的所有内容都会作为数组的第一个元素返回。对于空字符串来说,它自身就是一个空字符串。

如果我们思考一下split算法的实现方式,这样的设计是有道理的。可能的实现方式是,我们从一个包含当前元素的空字符串开始,然后循环遍历字符串的每一个字符,将它们添加到当前元素中,直到遍历到字符串的末尾或者遇到分隔符。然后将当前元素推入结果数组中。

对于长度为零的字符串,我们从一个空字符串开始作为当前元素。由于直接到达了字符串的末尾,所以我们将空字符串推入结果数组中并返回。

这也是split方法的预期行为。根据ECMAScript语言规范:

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

而根据Mozilla的文档:

当找到分隔符时,它会从字符串中移除分隔符,并将子字符串返回为数组。如果没有找到分隔符或者分隔符被省略,数组会包含一个由整个字符串组成的元素。

需要注意的是,当字符串为空时,split方法会返回一个包含一个空字符串的数组,而不是一个空数组。

如果你不喜欢这种行为,你可以自己编写一个版本:

// 如果字符串为空,则返回一个空数组
// 否则返回普通split方法的结果
split2 = (separator) => this == "" ? [] : this.split(separator);

0