2016-11-08 2 views
0

In Javascript ist. Wie kann ich testen, ob eine Variable gleich function Number() oder function String() ist.Wie überprüft man, ob die Variable vom Typ Funktion Number() oder Funktion String() js

Ich lese eine Reactive-Prop von einer Schemadefinition, für die der Typ als eine Eigenschaft festgelegt ist. So ein this.props.fieldType ist ein function Number() oder function String().

Ich habe versucht:

if(this.props.fieldType instanceof Number) 

und

if(Object.getPrototypeOf(this.props.fieldType) === Number.prototype) 

nach instanceof description aber das funktioniert nicht. Nicht sicher warum.

+0

Versuchen Sie, das Val zu überprüfen Ist eine Zahl (wie "1") oder eine Zeichenkette (wie "foo")? –

+0

nicht. Versuchen Sie zu überprüfen, ob die Eigenschaft einen Wert von 'function Number()' von 'function String()' –

+1

hat. Ihre 'instanceof' Prüfung gibt nur' true' zurück, wenn Ihr 'fieldType' mit' new Number() 'erstellt wurde oder 'new String()'. Ist das der Fall? –

Antwort

4

versuchen, zu überprüfen, ob die Eigenschaft einen Wert von function Number() von function String() hat

Wenn Sie buchstäblich die Funktionen bedeutenNumber oder String verwenden == (oder ===):

if (this.props.fieldType === Number) { 

Wenn Sie "ist es eine Nummer" oder "ist es eine Zeichenfolge", verwenden Sie typeof, nicht instanceof:

if (typeof this.props.fieldType === "number") { 

Wenn Sie meinen, „ist es ein Objekt über neue Number erstellt“ (was wirklich ungewöhnlich wäre), dann instanceof ist, was Sie wollen:

if (this.props.fieldType instanceof Number) { 

Beispiele für alle drei:

var props = { 
 
    numberFunction: Number, 
 
    number: 42, 
 
    numberObject: new Number(42) 
 
}; 
 
console.log(props.numberFunction === Number); 
 
console.log(typeof props.number === "number"); 
 
console.log(props.numberObject instanceof Number);


Sie erwähnten instanceof in Bezug auf getPrototypeOf und einen Gleichheitsvergleich. Es ist wichtig zu verstehen, dass dies sehr unterschiedliche Dinge sind. die aktuelle prototype Eigenschaft der Funktion (der rechte Operand) hat überall in seiner Prototypkette

instanceof überprüft, ob das Objekt (der linke Operand). Es ist möglicherweise nicht der unmittelbare Prototyp des Objekts; es kann weiter unten sein.Zum Beispiel:

function Thing() { 
 
} 
 
var t = new Thing(); 
 
// The following is true, Object.prototype is in t's prototype chain 
 
console.log(t instanceof Object); 
 
// The following is false, t's prototype isn't Object.prototype; 
 
// Object.prototype is further down t's prototype chain 
 
console.log(Object.getPrototypeOf(t) === Object.prototype);

0

Sure Strich Weg effizienter ist, aber der beste Weg, um zu überprüfen, wenn die Effizienz ist kein Problem,

function isFunctionA(object) { 
return object && getClass.call(object) == '[object Function]'; 
} 

Somit ist die endgültige isFunction Funktion ist wie folgt:

function isFunction(functionToCheck) { 
var getType = {}; 
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; 
} 
Verwandte Themen