2017-07-11 2 views
0

Ich möchte in einer einzigen Funktion zwei Möglichkeiten der Übergabe von Parametern behandeln. 1) Es sollte ein Standard Weg mit der Übergabe einzelner Parameter sein 2) Es sollte eine Möglichkeit mit einem Array Destruct sein, alle übergebenen Parameter in diesem Array zu holen.Javascript erkennen zerstörten Parameter

Etwas wie folgt aus:

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


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

Es funktioniert gut und druckt beide Konsole abzumelden. Ich möchte aber auch die Möglichkeit haben, einen einzigen Parameter zu übergeben. So etwas Ähnliches:

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); 

Ich kann die Zerstörungs Betreiber bis zu einem gewissen Variable zur Folge haben und testen nicht abtreten es geben ist über typeof usw., weil bei realen destructing - es ist unmöglich.

P.S. Ich weiß, dass der Destruct-Operator nur mit Arrays funktioniert und nicht auf die Number angewendet werden kann. Aber es ist nur ein Beispiel.

Ich frage mich nur, wie ich oder 1 Parameter (wie Zahl) in eine Funktion übergeben oder erkennen, dass dieser Parameter ein Array ist und ich alle Array-Elemente abrufen und in die Funktion wie im Fall mit Standardfunktion mit aufrufen sollte mehrere Parameter

myFunc(1,2,3,4) 

Vielleicht kann mir jemand helfen? Danke für jede Information.

UPDATE:

Wie wie eine hässliche Lösung kann ich einfach verwenden, wenn Typprüfung, aber ich weiß nicht, wie richtig es sein wird.

+1

Warum nicht einfach 'a (b)'? – Cristy

+0

Können Sie 'a (b)' nicht aufrufen und dann überprüfen, ob b ein Array innerhalb Ihrer Funktion ist? – James

+0

In meinem Fall leider nicht. Beachte jede Funktion sollte nicht über Arten von Parametern wissen. Es sollte wie bei einem Standardanruf funktionieren. (Es ist sehr wichtig becase Ich möchte ein Dienstprogramm entwickeln, das verwendet wird, um viel vorhandenen Code zu erhöhen). Wenn also eine Funktion A, B, C annehmen soll, sollte sie am Ende direkt A, B, C und kein Array erhalten. – Velidan

Antwort

1

Sie können den Wert zuerst als Array umwandeln.

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

concat() wird entweder ein Array oder einzelnen Wert annehmen, und es wird auf die einzelne Array concat, effektiv um einen einzelnen Wert zu einem Array Gehäuse (mit einem Wert) oder etwas zu verlassen, der bereits ein Array allein.

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

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

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

+0

Danke für die Antwort. Du bist ein Genie :) So elegant und sehr interessante Lösung! – Velidan

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

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

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

Die Argumente Objekt ist ein Array-ähnliches Objekt an die zu einer Funktion übergeben Argumente entspricht.

+0

Danke für die Antwort, aber ich möchte keine Logik der Typchecking/Manipulation mit den Argumenten innerhalb einer aufgerufenen Funktion haben, becase gibt es eine Menge von "Funktionen" Dritter, so dass es unmöglich ist, das zu tun. Der Funktionsaufruf sollte wie erwartet "Standard" sein. – Velidan

+0

@Velidan also möchten Sie diese Art von Informationen über die Parameter erhalten, bevor es ausgeführt wird? –

+0

Genau, ich möchte dies vor der Ausführung der Funktion behandeln. Ich möchte die Quellfunktion unberührt lassen. – Velidan