2016-12-27 6 views
3

)変数名は(プロンプトの動作を変更変更しない、次のようにpromptを使用しての極めて簡単な例が行く:このコードではなぜ

<!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> 

、[OK]を、[キャンセル]をクリックしをクリックするか、閉じているかどうかChromeの開発ツールでproblem!!!と表示されているすべてのケースでクロスをクリックすると、プロンプトが表示されます。しかし、あなたが何か他のものにnameを変更する場合は、[OK]をクリックすると...

<!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> 

が...その後problem!!!はONLY表示されます。そんなことがあるものか? promptの変数名の変更動作が変更されるのはなぜですか?

+0

あなたは 'true/false'か空文字列' '' '' –

答えて

1

nameはグローバル変数ですwindowvar nameはリセットされていないか、再宣言されていません。それでもなおwindow.nameを参照しています。

window.name = nullを設定することはできません。 DOMはDOMの仕様のようにstringである必要があるため、代わりに"null"になります。

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 

この問題を回避するには、代わりにletを導入してください。

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. 

ここでは、グローバルスコープでname変数を作成しているが、デフォルトのスコープですwindow範囲内に存在nameプロパティが既に存在している詳細についてはWhat's the difference between using "let" and "var" to declare a variable?

3

あなたは「より良い回避するために、」識別子の問題に実行されている可能性があります:(X、ESC後のキャンセル)で結果をpromptの結果としてnameを設定しようとし See here

Chromeで

とエッジ(14) namenullの代わりに文字列"null"に設定されています。 IE 11はnameをnullに設定します。

実際に[OK]を押すと、入力した内容にnameが設定されます。

他の変数名は実際にはnullに設定されています(esc、cancel、xの結果)。

+0

でテストする必要があります。 – Alex

1

なぜなら、「名前」はグローバルウィンドウからグローバルに持ち上げられたからです。デフォルト値は ""で、nullではありません。 最初のフォームは、ユーザーがキャンセルをヒットした場合でも名前が定義されています(単にリセットされません)。 2番目の形式ではまだ定義されていない変数が使用されているため、キャンセルされた場合は値がnullになります。

0

をこれを参照してください。あなたが名前は、あなたがそれに任意の値を代入しても、そのセッターは、文字列に変換しますので、独自のgettersettersを持っていることがわかります。ここ

Object.getOwnPropertyDescriptor(window, 'name') 

を使用して、そのプロパティを確認することができます。したがって後者の場合にrandomNumber変数が期待どおりに動作し、したがってglobal又はwindow範囲で定義されていないよう

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

。あなたのケースでは

namenullに設定されていたが、このようにあなたのifが正しく実行されていませんでしたstringすなわち

name; // 'null' 

として救われました。

nameのプロパティについては、windowのread hereを参照してください。