2016-12-27 4 views
3

Ein extrem einfaches Beispiel prompt der Verwendung geht wie folgt:Warum einen Variablennamen nicht zu ändern Verhalten der Eingabeaufforderung ändern()

<!DOCTYPE html> 
<html lang="en"> 
<head></head> 
<body> 
    <script> 
     var name = prompt("Please enter your name"); 
     if (name != null) { 
      console.log('problem!!!'); 
     } 
    </script> 
</body> 
</html> 

Mit diesem Code, ob Sie auf OK klicken, klicken Sie auf Abbrechen, oder schließen Sie die Wenn Sie auf das Kreuz klicken, wird in den Chrome-Dev-Tools problem!!! angezeigt. Aber wenn Sie name etwas ändern sonst ...

<!DOCTYPE html> 
<html lang="en"> 
<head></head> 
<body> 
    <script> 
     var randomName = prompt("Please enter your name"); 
     if (randomName != null) { 
      console.log('problem!!!'); 
     } 
    </script> 
</body> 
</html> 

... dann problem!!! zeigt nur auf, wenn Sie auf OK klicken. Wie ist das möglich? Warum ändert sich der Name der Variablen, wenn das Verhalten der Funktion prompt geändert wird?

+0

sollten Sie mit 'true/false' oder einer leeren Zeichenfolge' '' ' –

Antwort

1

name ist globalen Variable auf window und var name wird nicht zurückgesetzt oder neu deklarieren. Es bezieht sich immer noch auf window.name.

Und Sie können nicht window.name = null gesetzt. DOM wird es "null" statt, weil es string wie in der DOM-Spezifikation sein.

var name; 
console.log(typeof name); //<- you got "string here" 
name = null; 
console.log(typeof name); //<- you still got "string here" 
console.log(name);  //<- you got string "null" not null 

um dieses Problem zu vermeiden ES6 einführen let statt.

let name; 
console.log(typeof name); //<- you got "undefined" 
name = null; 
console.log(typeof name); //<- you got "object" 
console.log(name);  //<- you got null as expected. 

sehen diese für weitere Informationen What's the difference between using "let" and "var" to declare a variable?

3

Sie könnten in einem laufen Kennung Problem "besser zu vermeiden": See here

auf Chrom und Edge (14) versucht name als Ergebnis prompt einzustellen (nach esc, Abbrechen, x) ergibt name wird auf den String "null", statt null gesetzt. IE 11 setzt name auf null.

Aber wenn Sie tatsächlich OK und drücken Sie dann name wird auf alles, was Sie eingegeben haben.

Andere Variablen Namen tatsächlich zu null als Ergebnis der esc gesetzt, Abbrechen, x.

+0

testen Ja, das dachte ich mir ... – Alex

1

Der Grund dafür ist, dass „Name“ ein globale aus dem globalen Fenster gehoben ist. Der Standardwert ist "", was nicht null ist. Das erste Formular hat einen Namen, selbst wenn der Benutzer auf Abbrechen klickt (es wird einfach nicht zurückgesetzt). Das zweite Formular verwendet eine Variable, die nicht bereits definiert ist, so dass es den Wert null erhält, wenn abgebrochen wird.

0

Hier können Sie name Variable im globalen Bereich schaffen, aber es gibt bereits name Eigenschaft in window Umfang, die der Standardbereich ist. Sie können diese Eigenschaft überprüfen

Object.getOwnPropertyDescriptor(window, 'name') 

Hier verwenden, können Sie die Namen seiner eigenen hat getter und setters somit auch wenn Sie einen Wert zuweisen, seine Setter es in String konvertieren.So

name = 34; // will save '34' to it not Integer 

Wo, wie in zweitem Fall randomNumber Variable definiert sind nicht in global oder window Umfang so dass wie erwartet funktioniert.

In Ihrem Fall name wurde auf null gesetzt, wurde aber als string heißt

name; // 'null' 

So kann Ihr if immer richtig wurde nicht ausgeführt, gespeichert zu werden.

Für mehr lesen Sie auf name Eigenschaft von window lesen here.

Verwandte Themen