Was ist der beste Weg, Anwender meiner Bibliotheksfunktionen zu sagen, dass Variablen übergeben wird, nicht vom richtigen Typ

StackOverflow https://stackoverflow.com/questions/430937

  •  08-07-2019
  •  | 
  •  

Frage

Ich bin zur Zeit in der Schaffung einer JavaScript-Funktion Bibliothek. Vor allem für den eigenen Gebrauch, aber man kann nie sicher sein, ob jemand anderes in ihren Projekten mit endet es, bin ich die Schaffung atleast es, als ob das könnte passieren.
Die meisten Methoden funktionieren nur, wenn die Variablen, die von dem korrekten Datentyp übergeben werden. Nun meine Frage ist: Was ist der beste Weg, Benutzer zu warnen, dass die Variable nicht vom richtigen Typ ist? Sollte man einen Fehler wie diese werfen?

function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
 if(typeof(thisShouldBeAString) === 'string') {
  throw('foo(var), var should be of type string');
 }
 #yadayada
}

Ich weiß, dass Sie Javascript interne Typumwandlung tut, aber diese sehr seltsame Ergebnisse schaffen kann (zB ‚234‘ + 5 = ‚2345‘, sondern ‚234‘ * 1 = 234), und dies könnte meine Methoden tun sehr seltsame Dinge machen.

Bearbeiten
Um die Dinge besonders deutlich zu machen: Ich möchte nicht Typumwandlung tun, übergeben die Variablen sollten den richtigen Typ sein. Was ist der beste Weg, um den Anwender meiner Bibliothek zu sagen, dass die übergebenen Variablen nicht vom richtigen Typ ist?

War es hilfreich?

Lösung

Einige kleine Bemerkungen über die Typprüfung - es ist eigentlich nicht so kompliziert:

Verwenden typeof prüfen Primitiven und instanceof für bestimmte Objekttypen zu überprüfen.

Beispiel: Überprüfen Sie für Strings mit

typeof x === 'string'

oder

typeof x === 'string' || x instanceof String

Wenn Sie String-Objekte enthalten.

Um Arrays zu überprüfen, benutzen Sie einfach

x instanceof Array

Dies sollte recht gut funktionieren (es gibt ein paar bekannten Ausnahmen - zB Firefox 3.0.5 hat einen Bug, wo window instanceof Object === false obwohl window.__proto__ instanceof Object === true).

Bearbeiten Es gibt einige weitere Probleme mit Erkennung von Funktionsobjekten:

Im Prinzip könnten Sie verwenden beide typeof func === 'function' und func instanceof Function.

Der Haken ist, dass in einem ungenannten Browser von einem großen Unternehmen dieser Kontrollen die falschen Ergebnisse für einige vordefinierte Funktionen zurückgeben (dessen Typ als 'object' angegeben). Ich kenne keine Abhilfe für dieses - die Kontrollen nur dann zuverlässig arbeiten für benutzerdefinierte Funktionen ...

edit2: Es gibt auch Probleme mit Objekten aus anderen Fenstern / Frames übergeben, wie sie von verschiedenen globalen Objekte erben werden - dh instanceof fehl. Abhilfen für integrierte Objekte existiert. Sie können beispielsweise für Arrays über Object.prototype.toString.call(x) === '[object Array]' überprüfen

Andere Tipps

Das Problem mit Typprüfung ist, dass sein eigentlich recht schwer zu tun. Zum Beispiel: -

var s = new String("Hello World!");
alert(typeof s);

Was wird alarmiert? Antwort: „Objekt“. Es ist wahr, es ist ein bekloppter Weg, um eine Zeichenfolge zu initialisieren, aber ich sehe es ganz oft none-the-less. Ich ziehe es Umwandlungen zu versuchen, wo notwendig oder einfach nichts tun.

Having said, die in einer Umgebung mit Javascript, in dem ich die totale Kontrolle haben (die nicht wahr, wenn Sie einfach nur die Bereitstellung einer Bibliothek) verwende ich diesen Satz von Prototyp zwickt : -

String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;

Damit für die gängigen Typen testen kann so einfach sein wie: -

if (x.isString)

Sie können sie aber immer noch müssen für null aufpassen / undefined: -

if (x != null && x.isString)

Neben dem new String("thing") Gotcha zu vermeiden, ist dieser Ansatz besonders kommt in seine eigenen auf Termine und Arrays.

Bibliotheken wie jQuery nicht informieren den Benutzer über den Fehler.

Wenn eine Funktion eine Zahl erwartet, und ein Benutzer übergibt eine Zeichenfolge, die Funktion gibt nur ohne etwas zu tun.

Auf diese Weise werden Sie JavaScript-Fehler vermeiden auf einer Live-Website auftauchen.

PS. So stellen Sie sicher, immer Ihre eingegebenen Parameter geben Sie überprüfen, um zu vermeiden, dass JavaScript-Fehler ausgelöst.

Wie wäre es throw: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/ werfen

Auch Typ von nicht zwischen Array unterscheiden, Null, Objekt sehr gut. Schauen Sie sich die funciton hier: http://javascript.crockford.com/remedial.html , plus gibt es ein paar andere Möglichkeiten, es zu tun.

Persönlich würde ich die Typprüfung nicht tun, da es ein Schritt, der nur mehr Verarbeitungszeit, um den Code hinzufügen. Wenn Sie über die Leistung kümmern, würden Sie wollen, wie viele Millisekunden der Verarbeitungszeit wie möglich abhauen. Gute Dokumentation wird die Notwendigkeit für die Prüfung heilen.

Wie sieht es nur leise Zeichenfolge numerischen Datentyp auf Funktion Start zu umwandeln?

Sie können immer den Datentyp ‚string‘ bestimmen. Können Sie nicht?

Sie könnten für einen Wert überprüfen wie „debug = 1“ gesetzt. Wenn es - könnten Sie Ausgabefehler wie Benachrichtigungen. So im Entwicklungsmodus Benutzer sieht sie, aber auf realen Ort wird er es auszuschalten. Ebenso Browser wird Ihnen keine Fehlermeldung -. Sie müssen bei JS-Konsole aussehen

Auch gibt es Firebug. Sie konnten das erkennen und auch Meldungen FB debug setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top