2017-02-04 3 views
0

Ich vermisse eindeutig etwas offensichtlich.JavaScript nicht undefiniert

Ich möchte einfach nach undefiniert suchen. Das Skript im Bild ist auf jede Weise, die ich kenne, um nach undefiniert zu suchen, aber obwohl Sie in der Uhr sehen können, dass der Wert für currentbusiness "undefiniert" ist, geht das Skript zur letzten else-Anweisung über. Warum wird das Skript nicht in die undefinierten Prüfungen eingefügt?

enter image description here

+1

Bitte Post-Text, keine Bilder. Nicht jeder kann Bilder sehen und es ist viel einfacher, Text zu suchen. – RobG

Antwort

1

Da der Wert ist "undefined" (ein String ist, beachten Sie die Anführungszeichen) undefined nicht.

Der Browserspeicher (localStorage/sessionStorage) wandelt beim Speichern alles in eine Zeichenkette um, daher erhalten Sie eine Zeichenkette zurück, egal, was Sie hineinlegen.

Wenn Sie undefined in einen String coerce erhalten Sie "undefined":

console.log(
 
    typeof String(undefined), // "string" this is what storage does to undefined 
 
    typeof undefined   // "undefined" 
 
);

Sie können mit einem einzigen strengen Vergleich für diese überprüfen currentBusiness === "undefined"

Eine weitere Option einfach nicht sein würde, Speichern Sie undefined Werte, die dann den Speicher tatsächlich zurückgeben würden Sie undefined (nicht "undefined") bei der Anforderung einen Wert, der nie gespeichert wurde und somit würde Ihre Schecks wie erwartet:

// assume currentBusiness was never stored in the first place 
// because we chose not to store undefined values 
localStorage["currentBusiness"] === undefined // true 

Eine andere Sache, erwähnenswert, ist, dass Sie redundante Kontrollen haben. Ihr erster if Zustand

if (typeof currentBusiness === 'undefined' || !currentBusiness) 

wird wahr sein, wenn der Wert "undefined" hat Typen, den nur der Wert undefined hat, oder der Wert falsy, was bedeutet es eine davon ist: "", 0, false, null, undefined, NaN.

Das bedeutet, wenn der Wert undefined oder irgendetwas falsy ist (dies ist an sich überflüssig, da undefined bereits falsy ist), es wird die erste if und die anderen drei Prüfungen wird nie für einen falsy Wert immer geben, weil sie alle Check passieren .

Als der Tat nur ein falsy Scheck würde alle Ihre Bedingungen abdecken:

if (!currentBusiness) // this handles all your individual checks 
0

localStorage alles wandelt man in Strings in sie setzen, so hat es die Zeichenfolge "undefined" darin anstelle des Wertes undefined .Sie können die übliche Art und Weise für das überprüfen:

if (currentBusiness === 'undefined') { 

aber es ist wahrscheinlich besser zu fixieren, was den Wert undefined Vertonung, um es von localStorage löschen zu machen statt:

if (valueToStore === undefined) { 
    localStorage.removeItem('currentBusiness'); 
} else { 
    localStorage.setItem('currentBusiness', valueToStore); 
} 
1

im rechts Sie sehen können, dass der Wert der Zeichenfolge „undefiniert“ ist und Sie nicht prüfen, dass in keinem der Fälle:

  1. typeof ... -> der Typ String
  2. der Wert
  3. der Wert nicht null ist nicht undefiniert
  4. (...!) -> der Wert truthy

Sie zum letzten 'else' Abschnitt so erhalten

Verwandte Themen