当前位置:  开发笔记 > 编程语言 > 正文

递归地连接javascript函数参数

如何解决《递归地连接javascript函数参数》经验,为你挑选了3个好方法。

我遇到了一个javascript难题:写一个单行的JavaScript代码,它连接传递给函数的所有字符串:


    function concatenate(/*any number of strings*/) {
      var string = /*your one line here*/
      return string;
    } 

@ Meebo的

看到函数参数表示为索引对象可能是一个数组,我认为可以以递归方式完成.但是我的递归实现会抛出错误. - "conc.arguments.shift不是函数" -


    function conc(){
        if (conc.arguments.length === 0) 
            return "";
        else 
            return conc.arguments.shift() + conc(conc.arguments);
}

似乎conc.arguments不是一个数组,但可以通过数字索引访问并具有长度属性??? 令人困惑 - 请分享意见和其他递归实施.

谢谢



1> Ionuț G. Sta..:

arguments 据说是一个类似数组的对象.正如您已经看到的那样,您可以通过索引访问其元素,但是您没有可以使用的所有Array方法.类似Array的对象的其他示例是getElementsByTagName()或getElementsByClassName()返回的HTML集合.jQuery,如果你曾经使用它,它也是一个类似数组的对象.查询一些DOM对象后,在DOM选项卡中使用Firebug检查生成的jQuery对象,你会看到我的意思.

这是我对Meebo问题的解决方案:

function conc(){
    if (arguments.length === 0)
        return "";
    else
        return Array.prototype.slice.call(arguments).join(" ");
}

alert(conc("a", "b", "c"));

Array.prototype.slice.call(arguments)将我们arguments转换为真正的Array对象是一个很好的技巧.在Firefox中Array.slice.call(arguments)就足够了,但它在IE6中不起作用(至少),所以前一版本是常用的.此外,这个技巧不适用于IE6中DOM API方法返回的集合(至少); 它会抛出一个错误.顺便说一句,而不是call一个人可以使用apply.

关于类似Array的对象的一点解释.在JavaScript中,您可以使用几乎任何东西来命名对象的成员,而数字也不例外.所以你可以构造一个看起来像这样的对象,这是完全有效的JavaScript:

var Foo = {
    bar : function() {
        alert('I am bar');
    },

    0 : function() {
        alert('I am 1');
    },

    length : 1
}

上面的对象是一个类似于Array的对象,原因有两个:

    它的成员名称是数字,所以它们就像数组索引

    它有一个length属性,没有该属性,您无法使用构造将对象转换为可验证的数组:Array.prototype.slice.call(Foo);

Function对象的arguments对象与Foo对象非常相似,只是它有其特殊用途.



2> Georg Schöll..:

关于这个主题的Mozilla:

arguments对象不是数组.它类似于数组,但除了length之外没有任何数组属性.例如,它没有pop方法.但是它可以转换为真实数组:

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

因此,您的问题的解决方案非常简单:

var string = Array.prototype.slice.call(arguments).join("");

顺便说一句:它进一步指出:

arguments对象是所有函数中可用的局部变量; 作为Function属性的参数不能再使用.

你应该只使用arguments而不是func.arguments



3> svinto..:

这有效:

function concatenate(){
    return [].join.call(arguments, "");
}
alert(concatenate("one", "two", "three"));

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有