JavaScript: Prüfen Sie, ob eine variable oder ein Objekt vorhanden ist
Habe ich eine Funktion zurück, wenn eine variable/Objekt gesetzt ist oder nicht:
function isset() {
var a = arguments, l = a.length;
if (l === 0) { console.log("Error: isset() is empty"); }
for (var i=0; i<l; i++) {
try {
if (typeof a[i] === "object") {
var j=0;
for (var obj in a[i]) { j++; }
if (j>0) { return true; }
else { return false; }
}
else if (a[i] === undefined || a[i] === null) { return false; }
}
catch(e) {
if (e.name === "ReferenceError") { return false; }
}
}
return true;
}
Zum Beispiel, das funktioniert:
var foo;
isset(foo); //Returns false
foo = "bar";
isset(foo); //Returns true
foo = {};
isset(foo); //Returns false
isset(foo.bar); //Returns false
foo = { bar: "test" };
isset(foo); //Returns true
isset(foo.bar); //Returns true
Hier ist das problem... wenn foo ist nie festgelegt, um zu beginnen mit, dies geschieht:
//foo has not been defined yet
isset(foo); //Returns "ReferenceError: foo is not defined"
Dachte ich, ich könnte mit try/catch/finally zurückgeben, false bei Fehler.name === "ReferenceError" aber es funktioniert nicht. Wo mache ich falsch?
Edit:
Also die Antwort ist unten korrigieren. Wie ich erwartet hatte, Sie keinen Zugriff auf eine nicht definierte variable oder Falle es mit try/catch/finally (siehe unten für eine Erklärung).
Allerdings ist hier eine nicht so elegante Lösung. Sie übergeben den Namen der Variablen in Anführungszeichen, dann mit eval zu tun, die überprüfung. Es ist hässlich, aber es funktioniert:
//Usage: isset("foo"); //Returns true or false
function isset(a) {
if (a) {
if (eval("!!window."+a)) {
if (eval("typeof "+a+" === 'object'")) { return eval("Object.keys("+a+").length > 0") ? true : false; }
return (eval(a+" === undefined") || eval(a+" === null") || eval(a+" === ''")) ? false : true;
}
else { return false; }
}
else { console.log("Empty value: isset()"); }
}
Und nur zu Folgen, bis die einen mehr, die ich gereinigt, bis die ursprüngliche Funktion an der Spitze. Es hat immer noch das gleiche problem, wo, wenn die variable nicht existiert, erhalten Sie einen ReferenceError, aber diese version ist viel sauberer:
//Usage: isset(foo); //Returns true or false if the variable exists.
function isset(a) {
if (a) {
if (typeof a === "object") { return Object.keys(a).length > 0 ? true : false; }
return (a === undefined || a === null || a === "") ? false : true;
}
else { console.log("Empty value: isset()"); }
}
- Ich gehe davon aus, dass
foo
ist eine Globale variable.window.foo
arbeiten. - Dies ist nicht PHP. JavaScript funktioniert etwas anders... man kann Zwar einen Wert zuweisen, nicht initialisierte Variablen, kann man eigentlich nicht verwenden Sie einen nicht-initialisierten Wert.
foo = bar + 2
wird nicht funktionieren, wennbar
ist nicht definiert.foo = 2
wird aber funktionieren, es sei denn im strikten Modus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man einfach nicht tun, die Art der überprüfung ist mit einer Funktion. Damit übergeben Sie die variable, die es braucht, um zu existieren, so dass es scheitern wird, bevor der code ausgeführt werden kann.
Wenn Sie es nennen, auf die nicht deklarierte variable, die Sie versuchen zu beheben, den Wert des Bezeichners, der in der argument-position.
Und natürlich, die gibt es nicht, so die ReferenceError geworfen wird.
JavaScript nicht haben Zeigern, also es gibt nichts wie ein
nil
Zeiger übergeben werden kann an seinem Platz.Sie können nicht passieren Sie eine id, die noch nicht initialisiert wurden. Könnten Sie eine Zeichenfolge übergeben, und ein Objekt, um zu testen, wie die folgenden: