PHPにはfunc_num_args
、func_get_args
JavaScriptにも同様のものはありますか?
PHPにはfunc_num_args
、func_get_args
JavaScriptにも同様のものはありますか?
回答:
引数があるアレイ状のオブジェクト(ない実際の配列)。関数の例...
function testArguments () // <-- notice no arguments specified
{
console.log(arguments); // outputs the arguments to the console
var htmlOutput = "";
for (var i=0; i < arguments.length; i++) {
htmlOutput += '<li>' + arguments[i] + '</li>';
}
document.write('<ul>' + htmlOutput + '</ul>');
}
やってみよう...
testArguments("This", "is", "a", "test"); // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9); // outputs [1,2,3,4,5,6,7,8,9]
詳細:https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
ES6では、関数の引数が次のような「...」表記で指定されている構文を使用できます。
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
a = () => {console.log(arguments);}; a('foo');
与え-- Uncaught ReferenceError: arguments is not defined
しかしa = (...args) => {console.log(args);}; a('foo');
与えます["foo"]
arguments
関数の引数が格納される場所を目的とします。
引数オブジェクトは配列のように機能し、見えますが、基本的には、配列が行うメソッドがないだけです。次に例を示します。
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
arguments
オブジェクトを実際の配列に変換する最良の方法は次のようになると思います:
argumentsArray = [].slice.apply(arguments);
これで配列になります。
再利用可能:
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
結果:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
[].slice.apply(arguments);
不要な空の配列割り当てが発生するため、最善の方法ではありません。
必要に応じて、配列に変換することもできます。ジェネリック配列が利用可能な場合:
var args = Array.slice(arguments)
さもないと:
var args = Array.prototype.slice.call(arguments);
Mozilla MDNから:
JavaScriptエンジン(V8など)での最適化が妨げられるため、引数をスライスしないでください。
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
使用します。文字列化の代わりに保存が必要な場合は、内部構造化クローニングアルゴリズムを使用します。DOMノードが渡される場合は、無関係な質問のようにXMLSerializerを使用します。with (new XMLSerializer()) {serializeToString(document.documentElement) }
他の多くの人が指摘したように、 arguments
ように、関数に渡されるすべての引数が含まれています。
同じ引数で別の関数を呼び出したい場合は、 apply
例:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
Gunnarへの同様の回答、より完全な例:すべてを透過的に返すこともできます。
function dumpArguments(...args) {
for (var i = 0; i < args.length; i++)
console.log(args[i]);
return args;
}
dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });
出力:
foo
bar
true
42
["yes","no"]
{"banana":true}
ES6では、次のようなことができます。
function foo(...args)
{
let [a,b,...c] = args;
console.log(a,b,c);
}
foo(1, null,"x",true, undefined);
ES6では、次を使用しますArray.from
。
function foo()
{
foo.bar = Array.from(arguments);
foo.baz = foo.bar.join();
}
foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"
ES6以外のコードの場合は、JSON.stringifyおよびJSON.parseを使用します。
function foo()
{
foo.bar = JSON.stringify(arguments);
foo.baz = JSON.parse(foo.bar);
}
/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]
/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]
文字列化ではなく保存が必要な場合は、内部構造化クローニングアルゴリズムを使用します。
DOMノードが渡される場合は、無関係な質問と同様にXMLSerializerを使用します。
with (new XMLSerializer()) {serializeToString(document.documentElement) }
ブックマークレットとして実行する場合、がJSON.stringify
正しく機能するように、各構造化データ引数をErrorコンストラクターでラップする必要がある場合があります。
参考文献
function
でのみ機能し、ES2015 +ファットアロー=>
機能では機能しません。それらについては、次の...args
ように関数定義で使用します(...args) => console.log(args)
。