[解決済み] JavaScript の Splat 演算子、Python の *args と **kwargs に相当するもの?
2023-04-27 16:14:02
質問
私はPythonをよく使いますが、今ちょうどJavaScriptを急いで勉強しているところです(というか、再勉強中です)。だから、私は尋ねたいと思った、何が同等の
*args
と
**kwargs
をJavaScriptで使うのですか?
どのように解決するのですか?
に最も近いイディオムは
*args
は
function func (a, b /*, *args*/) {
var star_args = Array.prototype.slice.call (arguments, func.length);
/* now star_args[0] is the first undeclared argument */
}
ということを利用して
Function.length
は関数定義で与えられた引数の数です。
のような小さなヘルパールーチンにこれをパッケージ化することができます。
function get_star_args (func, args) {
return Array.prototype.slice.call (args, func.length);
}
で、次に
function func (a, b /*, *args*/) {
var star_args = get_star_args (func, arguments);
/* now star_args[0] is the first undeclared argument */
}
もしあなたが構文解析をしたい気分なら、ある関数を必須引数とオプション引数で呼び出される別の関数に変換し、必須引数を一緒に渡し、追加のオプション引数は最終位置で配列として渡す関数を書いてください。
function argsify(fn){
return function(){
var args_in = Array.prototype.slice.call (arguments); //args called with
var required = args_in.slice (0,fn.length-1); //take first n
var optional = args_in.slice (fn.length-1); //take remaining optional
var args_out = required; //args to call with
args_out.push (optional); //with optionals as array
return fn.apply (0, args_out);
};
}
次のように使用します。
// original function
function myfunc (a, b, star_args) {
console.log (a, b, star_args[0]); // will display 1, 2, 3
}
// argsify it
var argsified_myfunc = argsify (myfunc);
// call argsified function
argsified_myfunc (1, 2, 3);
もし、呼び出し元がオプションの引数を配列として渡すことを望んでいるのであれば、このような面倒なことをすべて省略することもできます。
myfunc (1, 2, [3]);
に対する類似の解決策はありません。
**kwargs
JSにはキーワード引数がないためです。その代わりに、呼び出し元がオプションの引数をオブジェクトとして渡すように要求するだけです。
function myfunc (a, b, starstar_kwargs) {
console.log (a, b, starstar_kwargs.x);
}
myfunc (1, 2, {x:3});
ES6アップデート
完全を期すために、ES6ではrestパラメータ機能でこの問題を解決していることを付け加えておきます。参照 Javascript - '...' の意味
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] Promise : then vs then + catch [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ
-
[解決済み] CoffeeScriptチュートリアルの "Splats "の意味とは?