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, wenn bar ist nicht definiert. foo = 2 wird aber funktionieren, es sei denn im strikten Modus.
InformationsquelleAutor the4tress | 2013-09-19
Schreibe einen Kommentar