2011-01-31 11 views
49

Javascriptでは、関数に対して定義された仮パラメータの数をどのように決定できますか?関数のアリティを取得する

関数が呼び出されたときのパラメータはargumentsではなく、関数が定義された名前付き引数の数です。

function zero() { 
    // Should return 0 
} 

function one(x) { 
    // Should return 1 
} 

function two(x, y) { 
    // Should return 2 
} 
+1

function(){return arguments [0];)のアリティは何ですか? }?もちろん – AtnNn

+5

@atnnn 0です。 – Phrogz

答えて

54
> zero.length 
0 
> one.length 
1 
> two.length 
2 

Source

関数このような独自のアリティ(長さ)を決定することができる:

// For IE, and ES5 strict mode (named function) 
function foo(x, y, z) { 
    return foo.length; // Will return 3 
} 

// Otherwise 
function bar(x, y) { 
    return arguments.callee.length; // Will return 2 
} 
+0

私は自分の質問に答えようとしていました。なぜなら、それはスタックオーバーフローではなかったからです。私はあなた自身のアリティを決定する関数のテクニックを使ってあなたの答えを更新します。 – JasonSmith

+0

'arguments.callee.length'を意味しますか? – Phrogz

+0

はい、私はそれを意味しました。 – JasonSmith

11

関数のアリティは、その.lengthプロパティに格納されています。

function zero() { 
    return arguments.callee.length; 
} 

function one(x) { 
    return arguments.callee.length; 
} 

function two(x, y) { 
    return arguments.callee.length; 
} 

> console.log("zero="+zero() + " one="+one() + " two="+two()) 
zero=0 one=1 two=2 
4

他の回答に記載されているように、lengthプロパティはそれを示しています。

  • 関数は、パラメータの末尾に「休息」のパラメータを持つことができます:だからzero.lengthは0、one.length 1になりますされ、two.lengthはES2015のよう2.

    なり、我々は2つのしわを持っています

  • 関数のパラメータはデフォルト値

「解像度を有することができる(arguments擬似配列とは異なり)、真の配列にその位置で、またはその後所定の引数を収集リストT」パラメータは、関数のアリティを決定する際にカウントされない:

function stillOne(a, ...rest) { } 
 
console.log(stillOne.length); // 1

同様に、デフォルトの引数を持つパラメータがアリティに追加しません、実際には他のものを防止します(彼らはundefinedのサイレント・デフォルトを持っていると仮定している)彼らは、明示的なデフォルト値を持っていない場合でも、それに追加することから、それを次

function oneAgain(a, b = 42) { } 
 
console.log(oneAgain.length); // 1 
 

 
function oneYetAgain(a, b = 42, c) { } 
 
console.log(oneYetAgain.length); // 1

+0

ありがとう!これは素晴らしいアップデートです。私は '' rest''のために真のアリティを隠していますが、 '.length'プロパティは依然として有効です。しかし、デフォルトのパラメータの場合は、回避策を知っていますか、あるいはデフォルトのパラメータがまったく使用されていることを検出する方法だけを知っていますか? – JasonSmith

+0

@JasonSmith:逆コンパイルに依存しないものはありません(例: 'Function#toString')。 –

0

関数arityは、関数に含まれるパラメータの数です。これは、lengthプロパティを呼び出すことで実現できます。

例:

function add(num1,num2){} 
console.log(add.length); // --> 2 

function add(num1,num2,num3){} 
console.log(add.length); // --> 3 

注:関数呼び出しで渡されたパラメータの数は、関数のアリティには影響を与えません。

0

関数が期待する引数の数を返すために使用されるarityプロパティは存在しなくなり、Function.prototype.lengthプロパティに置き換えられました。

関連する問題