JSの変数と作用域、undefinedとnullを深く理解する。


1、Javascript変数のスコープ
javascriptでは、変数は主に局所変数と大域変数の2つに分類され、対応する作用域も局所作用域と大域作用域である。
1ローカル変数とスコープ
局所変数は一般的に関数内部宣言で使用されます。

function func(){
  var i=12;//    
  ......
}
局所変数の作用領域は、この変数を宣言する関数の範囲内で使用されます。
局所変数の宣言周期は、関数が起動されて実行が開始されて初期化され、関数呼び出しが実行された後に破棄されます。
2、グローバル変数とスコープ
大域変数は一般的に関数外で宣言されます。

var i=12;//    
function func(){
  ......
}
宣言なしで直接使用する変数もあります。デフォルトはグローバル変数です。

function func(){
  i=12;//     (  var      ),       
}
グローバル変数は現在のページのすべてのスクリプトとメソッドで使用できます。スコープは現在のページスクリプトの中です。
グローバル変数の宣言周期は、変数が初期化されたときに作成され、現在のページが閉じているときに破棄されます。
2、typeofキーワード
typeofキーワードは主に変数のデータタイプを検出するために用いられます。JavaScriptの主要なデータタイプはstring、number、Boolean、objectなどがあります。

console.log(typeof 'str');//string
console.log(typeof 23);//number
console.log(typeof false);//boolean
console.log(typeof [1,3,12]);//object
console.log(typeof {name:'jack',age:12});//object
console.log(typeof new Date());//object
注意:jsの配列、jsonのオブジェクトはすべてobjectのデータタイプです。
3、nullとundefined
nullとundefinedはJavaScriptによく登場します。一つの変数を表す値が空か一つの変数が定義されていません。値を表すときは、すべて空の値として表示されますが、データの種類によっては違います。

console.log(typeof null);//object
var persion = null;
console.log(persion);//null

console.log(typeof undefined);//undefined
var persion2;
console.log(persion2);//undefined
nullのデータタイプはobjectで、undefinedのデータタイプはundefinedです。
変数宣言、値はnull、変数値はnullです。変数は宣言のみで、値が与えられていません。値はundefinedです。
比較をもう一つ見る:

console.log(null==undefined);//true    
console.log(null===undefined);//false       
これで、nullとundefinedの表示値は全部空です。nullのデータタイプはobjectで、undefinedのデータタイプはundefinedです。宣言のみで初期化されていない値はundefinedです。
以下は補充です
Situation One

<script>
  var i; //    
  //    camel   
  //            

  function sayHello(){
  var x=100;
  alert(x);
  x++;
  }
  sayHello(); //  100
  alert(x); //  ,  x     ,    
</script>
Situation Two

<script>
function sayHello(){
  var x=100;
  if(x==100){
    var y=x+1;
    alert(y); //  101
  }
  alert(y); //   101,     ,        , C#      !!!

  for(var i=0;i<2;i++){
    alert(i)
  } // for               
  alert(i); //  i     ,    2

}
sayHello();
</script>
注:変数を使う前にvar宣言を使わなくてもいいです。このような変数は「グローバル変数」と見なされますが、このように使うことは少ないです。
undefinedとnullについて
次のような場合があります。変数の値はundefinedです。
1、変数定義ですが、変数の値はundefinedです。
2、呼び出しの方法は戻り値がなく、戻り値はundefinedです。
3、オブジェクトの属性値が存在しない場合、戻り値はundefinedで、例えば:Dcument.ddd
Example 1:

var xx;
var yy=null;

if(xx==yy){

  alert('  ');

}

else{

  alert('  ');
}
出力結果は等しいです。if判断を行う時、ブラウザはxxとyyに対して値の判断を行います。両者は具体的な値がないので、彼らはfalseだと思います。
if判定で====[全イコール符号]に変換すると出力がまちまちです。xxとyyを要求するデータのタイプと値は同じでなければならないということを表すからです。
 
Example 2:

var xx=10
var yy='10';

if(xx==yy){

  alert('  ');
}

else{

  alert('  ');
}
出力は等しいです。===に換えると、出力は待ちません。
Example 3:

var n='10';
switch(n){
  case 10:

    alert('  ');
  break;

  case '10':

    alert('   ');
  break;
}
出力文字列
switchでの判断はタイプを考慮します。
まとめ:ifでの判断は判定値であり、タイプを考えない