【问题标题】:The confusion about the split() function of JavaScript with an empty string关于 JavaScript 的 split() 函数与空字符串的混淆
【发布时间】:2011-07-07 02:21:51
【问题描述】:

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

var str = "";

然后我用“&”分割:

var strs = str.split('&');

最后,我显示strs的长度:

alert( strs.length);

它会提示“1”。

但是我没有给“str”变量赋值。为什么还有长度,不应该是零吗?

【问题讨论】:

  • 如果你不关心虚假值,你可以做一个简单的.split('...').filter(Boolean)。

标签: javascript split


【解决方案1】:

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

[ "" ]

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

【讨论】:

    【解决方案2】:

    来自 MDC 文档中心:

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

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

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

    【讨论】:

    • 这种“设计选择”何时会比返回空数组更好?
    • 这是为了一致性。 '&'.split('&') 返回 2 个空字符串; '&&'.split('&') 返回 3;等
    • @Spongman 这不是一个错误,它非常有意义。如果它以任何其他方式工作,那将是不一致的,并且不一致可以说是编程中最严重的罪过。
    • 让我们通过例子来思考这个问题。想象一下,您有一个包含三行的文本文件,并将其拆分为换行符:"One\n\nThree".split('\n'),即["One","","Three"]。请注意,第二行是空白的 ("")。如果文本文件只有一行,"One".split('\n') 结果是["One"]。所以从逻辑上讲,"".split('\n') 应该是[""],因为还有一行。该行是空白的,但我们之前看到空白行是""。在某些语言(例如 C#)中,可以选择从输出中删除空条目,但 JavaScript 不提供。
    • 您可以尝试str.split('&').filter(o=>o),这将消除数组中的任何空字符串,在您的情况下,它将返回一个空数组!
    【解决方案3】:

    JavaScript split 创建一个数组。也就是说,你的变量strs = [0]=>"",它的长度是1。

    【讨论】:

      【解决方案4】:

      说明

      split 方法返回新的 数组。

      找到后,分隔符从 字符串和子字符串是 以数组形式返回。如果分隔符是 省略,数组包含一个 由整个组成的元素 字符串。

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

      https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split

      【讨论】:

        【解决方案5】:

        拆分window.location.pathname

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

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

        var str = window.location.pathname.split('/');
        

        在设计上会被拆分成["" , "index.html"],这里已经多次提到了。

        在这种情况下可以做的是,像这样去除前导和尾随 /:

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

        并以“正确”的长度结束。

        【讨论】:

          【解决方案6】:

          我厌倦了总是检查 a[0] == '' 所以:

          String.prototype.splitPlus = function(sep) {
            var a = this.split(sep)
            if (a[0] == '') return [];
            return a;
          };
          

          元素 1 可能为空时的更正版本:

           String.prototype.splitPlus = function(sep) {
             var a = this.split(sep)
             if (a[0] == '' && a.length == 1) return [];
             return a;
            };
          

          【讨论】:

          • 这对于 ",a,b,c".splitPlus(",") 将失败,但是 - 当它应该返回 [""、"a"、"b"、" 时返回 [] C”]。您还必须检查数组长度。
          • 将 && a.length > 0 添加到您的 if 条件中。
          • @aggaton 我添加了更正的版本:if (a[0] == '' && a.length == 1) return [];
          • 为什么不===? .
          【解决方案7】:

          试试这个

          javascript通过split函数给出两个数组,然后

          var Val = "abc@gmail.com";
          var mail = Val.split('@');
          
          if(mail[0] && mail[1])  {   alert('valid'); }
          else    {   alert('Enter valid email id');  valid=0;    }
          

          如果两个数组的长度都大于 0,则条件为真

          【讨论】:

            【解决方案8】:

            消除任何空字符串。

            str.split('{SEPERATOR}').filter(r => r !== 'null')
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多