次のような不明な数の引数を渡す方法はありますか?
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
また、渡された引数の数を取得するにはどうすればよいですか?
次のような不明な数の引数を渡す方法はありますか?
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
また、渡された引数の数を取得するにはどうすればよいですか?
.apply)。他のものは、(関数内から)未知の数の引数を読み取る方法を示しています(を使用してarguments)。
回答:
arguments配列と同様に動作するマジックオブジェクトを介して、任意のjavascript関数に渡された引数にアクセスできます。arguments関数の使用は次のようになります
var print_names = function() {
for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}
これは配列でargumentsはないことに注意することが重要です。MDCにはいくつかの優れたドキュメントがあります:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object
あなたが変えたい場合はarguments、あなたがのようなものを行うことができるように配列に.slice()、.push()など、このような使用の何かを:
var args = Array.prototype.slice.call(arguments);
より良い方法があります!新しいレストパラメータ機能には、次のような特徴があります。
var print_names = function(...names) {
for (let i=0; i<names.length; i++) console.log(names[i]);
}
spread syntaxはここではかなり間違っています。それはrest parameterあなたが与えた例です。良い答えは、それは次のように参照されていることを混乱spread
Array.prototype.slice.call(arguments):medium.com/@andrewsburke/...
活用し、残りのパラメータの構文。
function printNames(...names) {
console.log(`number of arguments: ${names.length}`);
for (var name of names) {
console.log(name);
}
}
printNames('foo', 'bar', 'baz');
RESTパラメータと引数オブジェクトの間には3つの主な違いがあります。
var
print_names = function() {
console.log.apply( this, arguments );
};
print_names( 1, 2, 3, 4 );
JavaScriptのすべての関数に渡される隠しオブジェクトがありますarguments。
arguments.length関数に渡される引数の量を取得するために使用するだけです。
引数を反復処理するには、ループを使用します。
for(var i = arguments.length; i--) {
var arg = arguments[i];
}
argumentsこれは実際の配列ではないことに注意してください。したがって、配列として必要な場合は、次のように変換します。
var args = Array.prototype.slice.call(arguments);
var args = Array.prototype.slice.call(arguments);、var args = Array.apply(null, arguments);などを、多くの方法があります...
arguments.length。forループを使用できます。
(function () {
for (var a = [], i = arguments.length; i--;) {
a.push(arguments[i]);
};
return a;
})(1, 2, 3, 4, 5, 6, 7, 8)
forブロックの後のセミコロンだけは実際には必要ありませんが、最後の行の最後にセミコロンを追加します。
ES6の方がはるかに優れています
function Example() {
return {
arguments: (...args) =>{
args.map(a => console.log());
}
}
}
var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');
これがお役に立てば幸いです
ES6のRESTパラメーター
const example = (...args) => {
for (arg in args) {
console.log(arg);
}
}
注:残りのパラメーターの前に通常のパラメーターを渡すことができます
const example = (arg1, ...args) => {
console.log(arg1);
for (arg in args) {
console.log(arg);
}
}
Spread / Rest演算子を使用してパラメーターを配列に収集するlengthと、配列のは渡したパラメーターの数になります。
function foo(...names) {
console.log(names);
return names;
}
console.log(foo(1, 2, 3, 4).length);
BabelJSを使用して、関数をoldschoolJSに変換しました。
"use strict";
function foo() {
for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
names[_key] = arguments[_key];
}
console.log(names);
return names;
}
私はこれをするのが好きです:
これは、引数の数がわからない場合は役に立ちませんが、引数の順序を覚えたくない場合は役立ちます。
/**
* @param params.one A test parameter
* @param params.two Another one
**/
function test(params) {
var one = params.one;
if(typeof(one) == 'undefined') {
throw new Error('params.one is undefined');
}
var two = params.two;
if(typeof(two) == 'undefined') {
throw new Error('params.two is undefined');
}
}