🖋️

JavaScript のデフォルト引数とキーワード引数を Julia と Python と比較する

2024/05/18に公開

要約

言語 定義 呼び出し
Julia f(x, y=2; a, b="b") f(x, a=a)
Python f(x, y=2, *, a, b="b") f(x, a=a)
JavaScript f(x, y = 2, { a, b = "b" }) f(x, undefined, { a: a })

動機

一番詳しいプログラミング言語は Julia なのだが、Python や JavaScript を触っているとどうなっているのかよく分からないのでいつでも思い出せるようにメモする。

言語別の説明

Julia

オプション引数 (optinoal argument)キーワード引数 (keyword argument) という。

Julia
function f(x, y=2; a, b="b")
    println("$x + $y = $a + $b")
end
f(1, a="a") # 1 + 2 = a + b

キーワードで渡すにはキーワード引数でなければならない。

Julia
g(x, y=2) = x + y
g(x=1, y=2) # ERROR: MethodError: no method matching g(; x::Int64, y::Int64)

Python

デフォルト引数 (default argument)キーワードだけの引数 (keyword-only argument) という。

Python
def f(x, y=2, *, a, b="b"):
    print(f"{x} + {y} = {a} + {b}")
f(1, a="a") # 1 + 2 = a + b

通常の引数もキーワードで渡せる。

Python
def g(x, y=2):
    return x + y
g(x=1, y=2) # 3

渡せないようにするには / の前に引数を置いて

Python
def g(x, y=2, /):
    return x + y
g(x=1, y=2) # TypeError: g() got some positional-only arguments passed as keyword arguments: 'x, y'

とする必要がある。

JavaScript

JavaScript にキーワード引数はなく、位置引数しかない。代わりに解体代入 (destructing assignment) を使った引数を使う。位置は合うように undefined で埋める。

JavaScript
function f(x, y = 2, { a, b = "b" }) {
    console.log(`${x} + ${y} = ${a} + ${b}`);
}
f(1, undefined, { a: "a" }); // 1 + 2 = a + b

f() は呼び出せそうに見えて呼び出せない。呼び出せるようにするには

JavaScript
function f(x, y = 2, { a, b = "b" } = {}) {
    console.log(`${x} + ${y} = ${a} + ${b}`);
}
f(); // undefined + 2 = undefined + b

とする。通常の引数もキーワードで渡せる。

JavaScript
function g(x, y = 2) {
    return x + y;
}
g(x = 1, y = 2); // 3

Discussion