2017-07-11 6 views
0

私は1つの関数で2つのパラメータを渡す方法を扱いたいと思います。 1)これは単一のパラメータを渡す標準的な方法であるべきです 2)この配列内の渡されたすべてのパラメータを取得するために配列を破壊する方法でなければなりません。このようなJavascriptは破壊されたパラメータを検出します

何か:

function a (z, c) { 
    console.log("z => ", z); 
    console.log("c => ", c); 
} 


let b = [1,2]; 
a(...b); 

それが正常に動作し、両方のコンソールがログアウトし出力します。しかし、私は1つのパラメータを渡す可能性も持っていたいと思っています。そのような何か:

function a (z, c) { 
    console.log("z => ", z); 
    console.log("c => ", c); 
} 

//now varibale b should contains a number, not an array. 
//let b = [1,2]; 

// how can I detect that here is an one parameter 
and I can't use the destructed parameter? How I can do this without changing a function call 

let b = 1; 

// throws an error 
a(...b); 

実際の消滅の場合ので、私は消滅演算子は、いくつかの変数に結果割り当て、それが経由typeof演算などを入力しますテストすることはできません - それは不可能です。

P.S. Destruct演算子は配列のみで動作し、Numberには適用できないことはわかっています。しかし、これは単なる例です。

私は関数に1つのパラメータ(数値のような)を渡すか、そのパラメータが配列であることを検出し、すべての配列項目をフェッチして標準の関数呼び出し複数のパラメータ

myFunc(1,2,3,4) 

多分誰かが私を助けることができますか?あらゆる情報をありがとう。

UPDATE:

型チェックならば、私はシンプルな使用することができますが、私はそれがものになるかどうか、正しいか分からない醜いソリューション好きなように。

function a (z, c) { 
console.log("z => ", z); 
console.log("c => ", c); 

} 

let b = 1; 

if (~Object.prototype.toString.call(b).indexOf("Array")) { 
a(...b); 
} else { 
a(b); 
} 
+1

単に「a(b)」ではないのはなぜですか? – Cristy

+0

'a(b)'を呼び出して、bが関数内の配列であるかどうか確認できませんか? – James

+0

私の場合、残念ながら、そうではありません。パラメータのタイプについて知っているべきではない関数にしてください。通常の呼び出しの場合と同様に正常に動作するはずです。 (既存のコードを多く使用するユーティリティを開発したいので、これは非常に重要です)。したがって、関数がA、B、Cを最終的にとるべきならば、配列ではなくA、B、Cを直接受け取るべきです。 – Velidan

答えて

1

まず、値を配列としてキャストできます。

a(...([].concat(b))); 

concat()効果(一つの値を持つ)配列に単一の値をケーシング又は既に単独アレイであるものを残して、アレイ又は単一の値のいずれかを受け入れる、単一のアレイにそれをconcatであろう。

const test = (a, b) => { 
 
    console.log(a, b); 
 
} 
 

 
const a = [1,2]; 
 
const b = 5; 
 

 
test(...([].concat(a))); 
 
test(...([].concat(b)));

+0

答えをありがとう。あなたは天才です:)とてもエレガントで非常に興味深い解決策! – Velidan

0
function a (z, c) { 
    console.log('number of parameters:', arguments.length); 

    console.log("z => ", z); 
    console.log("c => ", c); 
} 

文献:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

引数オブジェクトは、関数に渡さ 引数に対応する配列のようなオブジェクトです。

+0

答えをありがとうが、私は、第三者の "関数"がたくさんあるので、呼び出された関数の内部で引数を使って型検査/操作のロジックを持ちたくないので、そうすることは不可能です。関数呼び出しは、期待どおりに "標準"でなければなりません。 – Velidan

+0

@Velidanこれは、実行前にこのような情報を取得したいのですか? –

+0

正確には、ソース関数をそのままにしておきたいので、関数の実行前にこれを処理したいと思います。 – Velidan

関連する問題