关于JavaScript的split()函数的困惑

hh5*_*188 39 javascript split

首先我设置一个变量,并将其设置为空:

var str = "";
Run Code Online (Sandbox Code Playgroud)

然后我通过"&"拆分它:

var strs = str.split('&');
Run Code Online (Sandbox Code Playgroud)

最后,我展示strs的长度:

alert( strs.length);
Run Code Online (Sandbox Code Playgroud)

它警告"1".

但我没有为'str'变量赋值.为什么它仍然有一个长度,它不应该是零?

Mar*_*sen 56

来自MDC文档中心:

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

阅读完整的文档:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split

换句话说,这是设计,而不是错误:)

  • 什么时候'设计选择'会比返回一个空数组更好? (10认同)
  • 这是_both_ by design _and_一个错误. (8认同)
  • 这是为了保持一致性.`'&'.split('&')`返回2个空字符串; `'&&'.split('&')`返回3; 等等 (4认同)
  • 让我们以示例的方式考虑一下。假设您有一个包含三行的文本文件,并在换行符处将其分割:`“ One \ n \ nThree” .split('\ n')`,即`[“ One”,“”,“ Three”]`。请注意,第二行为空白(`“”`)。如果文本文件只有一行““ One” .split('\ n')`,则结果为“ [” One“]`。因此从逻辑上讲,“” .. split('\ n')`应该为[[“”]`,因为仍然只有一行。该行是空白的,但是我们之前看到的空白行是“””。在某些语言(例如C#)中,可以选择从输出中删除空条目,但JavaScript不提供。 (4认同)
  • @Spongman,这不是一个错误,它完全有道理。如果它以其他方式工作,就会不一致,而不一致可以说是编程中最严重的罪过。 (2认同)
  • 您可以尝试`str.split('&').filter(o=>o)`,它会消除数组中的任何空字符串,在您的情况下,它将返回一个空数组! (2认同)
  • @MArkMYoung 遗憾的是你没有抓住要点 - 这个问题是关于 split 函数的。您正在关注 join 函数。您的观察是正确的,但与帖子完全无关。 (2认同)

Bol*_*ock 8

因为你得到一个包含空字符串的数组:

[ "" ]
Run Code Online (Sandbox Code Playgroud)

那个空字符串是一个元素.所以length是1.


小智 7

消除任何空字符串。

str.split('{SEPERATOR}').filter(r => r !== 'null')
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是在检查值为“null”的字符串。这有效> .filter(r => r !== '') (6认同)

mah*_*ich 5

拆分window.location.pathname

请注意,在window.location.pathname拆分时,它也将返回+1的长度.

让我们假设在这种情况下我们的路径名是:/index.html.

var str = window.location.pathname.split('/');
Run Code Online (Sandbox Code Playgroud)

它将被分解为["" , "index.html"]设计,如前所述.

在这种情况下,可以做的是,剥去前导和尾随,/如下所示:

var str = window.location.pathname.replace(/^\/|\/$/g, '').split('/');
Run Code Online (Sandbox Code Playgroud)

并以"正确"的ed长度结束.