【问题标题】:individual characters treated as string in javascript arguments在 javascript 参数中被视为字符串的单个字符
【发布时间】:2015-02-23 08:49:36
【问题描述】:

我需要编写一个函数来检索传递给函数的最后一个参数。如果它只是参数,它应该返回最后一个元素。如果它是一个字符串,它应该返回最后一个字符。数组应该返回数组的最后一个元素。我的代码适用于数组、字符串和参数,只要它们不都是字符串。

function last(list){
  var arr;
  if(list instanceof Array){
    return list[list.length-1];
  }
  if(typeof list === 'string' || list instanceof String){
    arr = list.split("");
    return arr[arr.length-1];
  }

  return arguments[arguments.length-1];
}

这几乎适用于所有情况,但是当输入是一堆字符串参数时我会遇到问题。

Test.assertEquals(last('a','b','c','z'), 'z');

返回'a'

为什么在测试参数是数组还是字符串时,不相交的字符串评估为真,我如何才能普遍访问任意参数的最后一个值?

【问题讨论】:

    标签: javascript arrays string arguments


    【解决方案1】:

    将您的函数调用更改为Test.assertEquals(last(['a','b','c','z']), 'z');

    在您向last() 传递四个不同的参数之前,这会传递一个参数,即一个包含四个字符的列表。

    【讨论】:

    • 这不是一个可接受的解决方法。该函数需要能够接受数组、字符串和参数。提供的测试用例是 Test.assertEquals(last(1,"b",3,"d",5), 5);我的代码有效,因为它下降到最后一个 return 语句,但不相交的字符被作为字符串读取,它进入第二个 if 语句。
    【解决方案2】:

    这样的事情应该这样做

    function last(){
        var a = arguments;
        return (a.length > 1 ? [].slice.call(a) :
                typeof a[0] === 'string' ? a[0].split('') : a[0]).pop();
    }
    

    FIDDLE

    【讨论】:

      【解决方案3】:

      像这样改变你的最后一个函数:

      function last(list){
        var arr;
        if(list instanceof Array){
          return list[list.length-1];
        }
        if((typeof list === 'string' || list instanceof String) && (arguments.length == 1)){
          arr = list.split("");
          return arr[arr.length-1];
        }
      
        return arguments[arguments.length-1];
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        相关资源
        最近更新 更多