2016-07-05 9 views
0

Angenommen, ich habe den folgenden Ereignishandler:Warum sind diese undefinierten Variablen nicht gleich Javascript?

function handleCsvDump(e) { 
    console.log(e.currentTarget.getAttribute('download')); 
    e.currentTarget.download = undefined; 
    console.log(e.currentTarget.getAttribute('download')); 
    console.log(e.currentTarget.getAttribute('download') === undefined); 

Die an die Konsole angemeldet Informationen, wenn die entsprechende Schaltfläche geklickt wird:

mycsv.csv 
undefined 
false 

Warum false der letzte Wert ist? Seit e.currentTarget.getAttribute('download') ist undefined, sollte es nicht wahr sein? Wenn dies der falsche Weg ist, wie kann ich testen, ob eine Variable nicht definiert ist?

+0

Blick auf [der Dokumentation getAttribute()] (https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute): * getAttribute() gibt den Wert eines angegebenen Attributs für das Element zurück. Wenn das angegebene Attribut nicht existiert, ist der zurückgegebene Wert entweder Null oder "" (der leere String); * –

+2

Sind Sie sicher, dass, wenn Sie 'download = undefined', es nicht zu einer Zeichenkette zwang, und Setzen Sie den Wert auf "undefined" '. Sieht Ihr Konsolenprotokoll aus wie "mycsv.csv", "undefined", "false" oder "mycsv.csv", undefined, false "? –

+0

James, das Konsolenprotokoll war wie 'mycsv.csv'. "undefiniert", "falsch". Es gab keine Anführungszeichen. –

Antwort

1

Sie müssen vorsichtig sein, wenn Sie die Dinge auf diese Weise einstellen, oft werden Strings erwartet, und wenn Sie einen Wert setzen, der kein String ist, wird er zuerst in einen String umgewandelt und dann zugewiesen.

Die download attribute ist in der Tat ein DOMString, was bedeutet, dass alles, was Sie es zuweisen wird erst in einen String umgewandelt werden, wenn es nicht bereits ist, also wenn Sie undefined zuweisen, ist es eigentlich zuerst "undefined" gezwungen und gespeichert wird.

Wenn Sie es wieder heraus zu bekommen, und vergleichen Sie es mit undefined, du tust tatsächlich:

console.log("undefined" === undefined) 

Daher false bekommen. Wenn Sie es tatsächlich entfernen wollen, die durch wollen impliziert es undefined einzustellen (oder null), können Sie stattdessen removeAttribute verwenden:

e.currentTarget.removeAttribute('download') 
Verwandte Themen