6

関数に渡されたすべての文字列を連結する 1 行の JavaScript コードを作成してください:


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

@ミーボ

関数の引数がインデックス付きオブジェクト MAYBE 配列として表されているのを見て、再帰的な方法で実行できると思いました。ただし、再帰的な実装でエラーがスローされます。--"conc.arguments.shift は関数ではありません" --


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

conc.arguments は配列ではないようですが、数値インデックスでアクセスでき、長さプロパティがありますか??? 紛らわしいです -- 意見やその他の再帰的な実装を共有してください。

ありがとう

4

6 に答える 6

13

arguments 配列のようなオブジェクトと言われています。すでに見たように、インデックスによってその要素にアクセスできますが、すべての 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 メソッドによって返されるコレクションでは機能しません。エラーがスローされます。ちなみに、代わりcallapply.

配列のようなオブジェクトについて少し説明します。JavaScript では、ほとんど何でもオブジェクトのメンバーに名前を付けることができ、数字も例外ではありません。したがって、完全に有効な JavaScript である次のようなオブジェクトを作成できます。

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

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

    length : 1
}

上記のオブジェクトは、次の 2 つの理由から配列のようなオブジェクトです。

  1. 名前が数字のメンバーがあるため、配列インデックスのようなものです
  2. それにはlengthプロパティがあり、それがないと、オブジェクトを構文を使用して真の配列に変換することはできません。Array.prototype.slice.call(Foo);

Function オブジェクトの arguments オブジェクトは Foo オブジェクトによく似ていますが、特別な目的があるという点だけが異なります。

于 2009-02-01T00:18:10.357 に答える
7

件名の Mozilla :

引数オブジェクトは配列ではありません。配列に似ていますが、長さ以外の配列プロパティはありません。たとえば、pop メソッドはありません。ただし、実数配列に変換できます。

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

したがって、問題の解決策は非常に簡単です。

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

ところで:それはさらに述べています:

引数オブジェクトは、すべての関数内で使用できるローカル変数です。Function のプロパティとしての引数は使用できなくなりました。

argumentsの代わりにのみ使用する必要がありますfunc.arguments

于 2009-02-01T00:07:14.030 に答える
6

これは機能します:

function concatenate(){
    return [].join.call(arguments, "");
}
alert(concatenate("one", "two", "three"));
于 2009-02-01T00:20:17.920 に答える
1

あなたはこれを行うことができます:

function concatenate() {
    if (arguments.length > 1) {
        return arguments[0] + concatenate.apply(this, Array.prototype.splice.call(arguments, 1));
    }
    return arguments[0];
}
于 2009-02-01T00:18:32.773 に答える
1

引数リストは真の配列ではありません。配列メソッドを借りて、「call」または「apply」の引数で使用できると思います。

于 2009-01-31T23:56:05.190 に答える