Split()函数在一个单字符上返回一个带有2个空字符串的数组?
Split()函数在一个单字符上返回一个带有2个空字符串的数组?
我在一个(基于动态/用户输入的)字符串上调用了split()方法,并对返回的数组中的每个元素进行了操作。偶尔我会遇到一个只有一个字符('/')的字符串,这给我带来了一些意外的结果(至少对我来说是意外的)。
如果我这样调用:
var randomString = '/'; var splitString = randomString.split('/');
splitString
返回的值是["", ""]
。我原本期望只收到[""]
。
为什么返回的数组中会有两个空字符串呢?我找不到任何关于这种情况的文档或示例。另外,在这个例子中,如果我只想接收一个空字符串,最好的方法是什么?只需移除最后一个空字符串吗?
谢谢
问题的出现的原因是split()函数的实现方式。该函数遍历字符串,寻找传入的分隔符,并将字符串的左部分存储起来。这是一个简单的split函数的版本,条件是它只匹配一个字符的分隔符。
解决方法是使用String.prototype.split()方法,该方法的实现方式不同于上述的简单版本。但是,它应该遵循相同的逻辑(需要考虑更复杂的分隔符,如单词或正则表达式)。
因此,当使用简单版本的split()函数时,返回的结果是两个空字符串的数组。原因如下:
- substring默认是一个空字符串("")。
- 在找到分隔符后,将substring(一个空字符串)保存到results数组中,然后再次将其设置为空字符串。
- 最后,在检查整个字符串后(在这种情况下,只有一个字符"/"),剩余的substring(也是一个空字符串)保存到results中。
需要注意的是,split()函数不限制返回为两个元素的数组,它可以返回与原始字符串长度相同的数组(例如,使用空字符串分隔符调用它时)。
使用split()
函数将字符串按照指定的字符(本例中为'/'
)进行分割,返回分割后的数组。如果分割的字符存在于字符串中,则返回分割字符之前和之后的内容,例如var randomString = 'Joe/Bill'
,结果为["Joe", "Bill"]
。但是在这个问题中,分割字符之前和之后都没有内容,因此返回["", ""]
。
如Oussail所说,如果在之后添加.filter(Boolean)
,它会移除数组中的空字符串,最终返回一个空数组[]
。
(.filter(Boolean)
会移除数组中的空字符串,参考链接:https://stackoverflow.com/a/54623591/12825520)
你可以通过以下方式检查这种情况:
var randomString = '/'; var splitString = randomString.split('/'); // 从结果中移除空字符串 splitString = splitString.filter(Boolean); if (splitString.length === 0) { // 在这里处理特殊情况 // 可能需要对其进行特殊处理 }