代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

为什么.join()不能与函数参数一起使用?

  •  66
  • Edward Tanguay  · 技术社区  · 15 年前

    为什么这样做(返回“1,2,3”):

    var words = ['one', 'two', 'three'];
    $("#main").append('<p>' + words.join(", ") + '</p>');
    

    这项工作(返回“列表:111”):

    var displayIt = function() {
        return 'the list: ' + arguments[0];
    }   
    $("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
    

    但不是这个(返回空白):

    var displayIt = function() {
        return 'the list: ' + arguments.join(",");
    }   
    $("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
    

    要对“arguments”变量使用.join(),我必须做什么?

    8 回复  |  直到 9 年前
        1
  •  85
  •   John Feminella    15 年前

    它不起作用,因为 arguments 对象不是数组,尽管它看起来像数组。它没有 join 方法:

    >>> var d = function() { return '[' + arguments.join(",") + ']'; }
    >>> d("a", "b", "c")
    TypeError: arguments.join is not a function
    

    皈依 争论 对于数组,可以执行以下操作:

    var args = Array.prototype.slice.call(arguments);
    

    现在 参加 将工作:

    >>> var d = function() {
      var args = Array.prototype.slice.call(arguments);
      return '[' + args.join(",") + ']';
    }
    >>> d("a", "b", "c");
    "[a,b,c]"
    

    或者,您可以使用jquery makeArray ,它将尝试将“几乎数组”转换为 争论 数组:

    var args = $.makeArray(arguments);
    

    这里是什么 Mozilla reference (这类事情我最喜欢的资源)不得不说:

    这个 争论 对象不是数组。 它类似于数组,但确实如此 没有任何数组属性,除非 length . 例如,它没有 流行方法。…

    这个 争论 对象仅可用 在函数体中。试图 访问arguments对象 函数声明导致 错误。

        2
  •  19
  •   Christian C. Salvadó    15 年前

    如果你对其他的不感兴趣 Array.prototype 方法,您只需使用 join ,您可以直接调用它,而无需将其转换为数组:

    var displayIt = function() {
        return 'the list: ' + Array.prototype.join.call(arguments, ',');
    };
    

    另外,如果不定义分隔符,您可能会发现知道逗号是默认分隔符很有用,方法是 spec 将使用逗号。

        3
  •  2
  •   Doug Neiner    15 年前

    只需使用jquery实用程序函数 makeArray

    arguments 不是数组,而是对象。但是,由于它是“类似数组”的,所以可以调用jquery实用程序函数 马克雷 要使其工作:

    var displayIt = function() {
        return 'the list: ' + $.makeArray(arguments).join(",");
    }   
    $("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
    

    将输出:

    <p>the list: 111,222,333</p>
    
        4
  •  2
  •   SpYk3HH    11 年前

    你可以用这个 jQuery .joinObj Extension/Plugin 我做的。

    正如你在小提琴中看到的,你可以使用它如下:

    $.joinObj(args, ",");
    

    $.(args).joinObj(",");
    

    插件代码:

    (function(c){c.joinObj||(c.extend({joinObj:function(a,d){var b="";if("string"===typeof d)for(x in a)switch(typeof a[x]){case "function":break;case "object":var e=c.joinObj(a[x],d);e!=__proto__&&(b+=""!=b?d+e:e);break;default:"selector"!=x&&"context"!=x&&"length"!=x&&"jquery"!=x&&(b+=""!=b?d+a[x]:a[x])}return b}}),c.fn.extend({joinObj:function(a){return"object"===typeof this&&"string"===typeof a?c.joinObj(this,a):c(this)}}))})(jQuery);
    
        5
  •  1
  •   Peter McG    15 年前

    您可以使用typeof查看此处发生的情况:

    >>> typeof(['one', 'two', 'three'])
    "object"
    >>> typeof(['one', 'two', 'three'].join)
    "function"
    >>> typeof(arguments)
    "object"
    >>> typeof(arguments.join)
    "undefined"
    

    在这两种情况下,您都可以看到typeof返回“object”,但只有一个对象定义了连接函数。

        6
  •  0
  •   easeout    15 年前

    arguments 不是jquery对象,只是普通的javascript对象。在你打电话之前把它延长 .join() . 我想你会写:

    return 'the list:' + $(arguments)[0];
    

    (我不太熟悉jquery,只是原型,所以希望这不是完全伪造的。)

    编辑:错了!但在他的回答中,道格·内纳描述了我正在努力实现的目标。

        7
  •  0
  •   Bernardo Amorim    15 年前

    我不知道是否有一种简单的方法可以将参数转换为数组,但您可以尝试这样做:

    var toreturn = "the list:";
    for(i = 0; i < arguments.length; i++)
    {
       if(i != 0) { toreturn += ", "; }
       toreturn += arguments[i];
    }
    
        8
  •  0
  •   Ryan White Paperpotato    9 年前

    现在您不能联接数组参数,因为它们不是数组, shown here

    所以你要么先把它们变成这样的数组,

    function f() {
      var args = Array.prototype.slice.call(arguments, f.length);
      return 'the list: ' + args.join(',');
    }
    

    或者像这样,稍微短一点

    function displayIt() {
      return 'the list: ' + [].join.call(arguments, ',');
    }
    

    如果你用的是 babel 或者兼容的浏览器使用ES6功能,也可以使用REST参数来实现。

    function displayIt(...args) {
      return 'the list: ' + args.join(',');
    }
    
    displayIt('111', '222', '333');
    

    这会让你做更酷的事情,比如

    function displayIt(start, glue, ...args) {
      return start + args.join(glue);
    }
    
    displayIt('the start: ', '111', '222', '333', ',');
    
    推荐文章