JS筆記一:nullとundefined、NaN、選択構造


  • 個人学習ノート
  • 阮一峰のJavaScript教育
  • を参照してください.
  • 2.1-2.2章
  • 変数
    1変数の宣言と割当は、2つのステップに分かれています.上のコードはそれらを合わせています.実際の手順は以下の通りです.
    
    var a;
    a = 1;
    変数を宣言するだけで値が与えられない場合、その変数の値はundefinedです.undefinedはJavaScriptのキーワードで、「無定義」を表しています.2変数の割り当て時に、varコマンドを書くのを忘れたら、この文も有効です.
    var a = 1;
    //     
    a = 1;
    
    しかし、varを書かないというやり方は、意図を表現するのに役立ちませんし、知らず知らずのうちにグローバル変数を作成しやすくなりますので、varコマンドを使って変数を宣言することをおすすめします.
    JavaScriptはダイナミックタイプの言語です.つまり変数の種類には制限がなく、変数はいつでもタイプを変更できます.
    var a = 1;
    a = 'hello';
    
    変数の昇格
    JavaScriptエンジンの動作方法は、先にコードを解析し、宣言されたすべての変数を取得して、もう1行ずつ実行します.この結果、すべての変数のステートメント文が、コードの先頭に引き上げられます.これを変数アップといいます.
    
    console.log(a);
    var a = 1;
    上記のコードはまずconsolie.log方法を使用して、コンソールに変数aの値を表示します.この時変数aはまだ声明と割当値を持っていませんので、これは間違ったやり方ですが、実際にはエラーを報告しません.変数アップグレードがあるので、本当に実行するのは以下のコードです.
    
    var a;
    console.log(a);
    a = 1;
    最後の結果は、変数aが宣言されていることを示すundefinedを示すが、まだ値が与えられていない.
    識別子
    最初の文字は、任意のUnicode文字(英字と他の言語のアルファベットを含む)とドル記号($)と下線(_)
    二番目の文字と後ろの文字はUnicode文字とドル記号と下線のほかに数字も使えます.0-9
    arg0
    _tmp
    $elem
    π
    上はすべて合法です
    if…else構造elseコードブロックは、常に自分に一番近いif文とペアを組む.
    var m = 1;
    var n = 2;
    
    if (m !== 1)
    if (n === 2) console.log('hello');
    else console.log('world');
    
    上記のコードは出力されません.elseコードブロックは実行されません.一番近いif文に続くので、以下のようになります.
    if (m !== 1) {
      if (n === 2) {
        console.log('hello');    
      } else {
        console.log('world');
      }
    }
    
    elseコードブロックを一番上のif文に従いたいなら、大かっこの位置を変更します.
    if (m !== 1) {
      if (n === 2) {
        console.log('hello');    
      }
    } else {
      console.log('world');
    }
    // world
    
    switch構造
    複数のif...elseを接続して使用する場合、より便利なswitch構造に変換することができる.
    switch (fruit) {
      case "banana":
        // ...
        break;
      case "apple":
        // ...
        break;
      default:
        // ...
    }
    
    上記のコードは、変数fruitの値に基づいて、対応するcaseを実行するように選択される.すべてのcaseが一致しない場合、最後のdefault部分が実行される.各caseコードブロック内部のbreakステートメントは少なくないが、そうでなければ次のcaseコードブロックを実行し続け、switch構造から逸脱するのではない.
    注意
    なお、switch文の後の表現は、case文の後の表現と比較して実行結果を示す場合、厳密に等しい演算子(===)を採用し、等しい演算子(==)ではなく、比較時にタイプ変換が発生しないことを意味する.
    var x = 1;
    
    switch (x) {
      case true:
        console.log('x       ');
      default:
        console.log('x         ');
    }
    // x         
    
    上記のコードでは、変数xにタイプ変換が発生していないため、case trueを実行しない場合があります.これは、switch文の内部に「厳密に等しい演算子」が採用されていることを示しています.詳しくは「演算子」の項を参照してください.
    三項演算子?:JavaScriptにはもう一つの3つの演算子(すなわち、演算子は3つの演算子を必要とする)?:があり、論理判断にも用いることができる.
    (  ) ?    1 :    2
    
    上記のコードでは、条件がtrueであれば、「表式1」の値を返します.そうでなければ、「表式2」の値を返します.
    var even = (n % 2 === 0) ? true : false;
    
    上のコードの中で、nが2で割り切れるなら、evenはtrueに等しい.そうでなければfalseに等しい.これは下の形式と同じです.
    var even;
    if (n % 2 === 0) {
      even = true;
    } else {
      even = false;
    }
    
    この3つの要素演算子は、if...else...の簡略化された形式と見なすことができるので、複数の場合に使用することができる.
    var myVar;
    console.log(
      myVar ?
      'myVar has a value' :
      'myVar do not has a value'
    )
    // myVar do not has a value
    
    上のコードは三元演算子を利用して、対応するヒントを出力します.
    var msg = '  ' + n + ' ' + (n % 2 === 0 ? '  ' : '  ');
    
    上のコードは3つの要素演算子を使用して、文字列に異なる値を挿入します.
    break文とcontine文break文とcontinue文はジャンプ作用があり、コードが既存の順序に従わないようにすることができます.break文は、コードブロックまたはループを飛び出すために使用されます.
    var i = 0;
    
    while(i < 100) {
      console.log('i    :' + i);
      i++;
      if (i === 10) break;
    }
    
    上のコードは10回のループしか実行できません.iが10に等しいと、ループが飛び出します.
    forサイクルはbreak文を使ってサイクルを飛び出すこともできます.
    for (var i = 0; i < 5; i++) {
      console.log(i);
      if (i === 3)
        break;
    }
    // 0
    // 1
    // 2
    // 3
    
    上のコードはiが3に等しいまで実行すると、ループが飛び出します.
    continue文は、このサイクルを直ちに終了し、循環構造の頭に戻り、次のサイクルを開始します.
    var i = 0;
    
    while (i < 100){
      i++;
      if (i % 2 === 0) continue;
      console.log('i    :' + i);
    }
    
    上のコードはiが奇数の場合のみ、iの値を出力します.iが偶数であれば、直接に次のサイクルに進む.
    多重ループがある場合は、パラメータなしのbreak文とcontinue文は、一番内側のループに対してのみ使用されます.
    データの種類
    データタイプの詳細
    typeof演算子
    typeof演算子詳細
    nullとundefined
    同じ点
  • nullは、undefinedとともに、「ない」という意味であり、非常に似ています.一つの変数をundefinedまたはnullとして与えます.正直に言って、文法効果はほとんど違いません.
  • は、if文では、いずれもfalseに自動的に変換され、等しい演算子(==)は、直接的に2つが等しいと報告される.
  • if (!undefined) {
      console.log('undefined is false');
    }
    // undefined is false
    
    if (!null) {
      console.log('null is false');
    }
    // null is false
    
    undefined == null
    // true
    違います
  • nullが数字に変換されると、自動的に0
  • になります.
    Number(null) // 0
    5 + null // 5
    上記のコードのうち、nullが数字に変換されると、自動的に0になります.
  • undefinedは、「ここには定義がない」という元の値であり、数値に変換した場合はNaNである.
  • Number(undefined) // NaN
    5 + undefined // NaN
  • null関数を呼び出したときの用法
  • nullは空の値を表しています.ここの値は空です.関数を呼び出したとき、あるパラメータには値が設定されていません.このとき、nullに入力して、このパラメータが空であることを表します.例えば、ある関数がエンジンから投げられたエラーをパラメータとして受け入れ、実行中にエラーがなければ、このパラメータはnullに伝えられ、エラーが発生していないことを示します.
  • undefinedは「未定義」を表し、次にundefinedに戻る典型的なシーン
  • である.
    //      ,     
    var i;
    i // undefined
    
    //      ,           ,      undefined
    function f(x) {
      return x;
    }
    f() // undefined
    
    //          
    var  o = new Object();
    o.p // undefined
    
    //         ,     undefined
    function f() {}
    f() // undefined
    NaN
    NaN-MDN詳細
  • グローバル属性NaNの値は、1つの数字(Not-A-Number)ではないことを示し、NaNは、1つのグローバルオブジェクトの属性である.NaN属性の初期値はNaNであり、Number.NaNの値と同じである.現代ブラウザ(ES 5)において、NaN属性は不構成であり、書き込み不可の属性である.
  • 符号化においては、NaNに直接的に使用されることは少ない.
  • は、一般的に計算に失敗したとき、Mathのある方法の戻り値として出現する(例えば:Math.sqrt(-1))
  • である.
  • または1つの文字列をデジタルに解析しようとしたが、失敗した場合(例えば、parseInt("blabla")).
  • は、一つの値がNaN等号演算子であるかどうかを判断する(==和=========).一つの値がNaNであるかどうかを判断するために用いることができない.Number.isNaN()またはisNaN()関数を使用しなければなりません.
  • 自己比較を実行する中で、NaNもNaNだけあって、比較の中でそれ自身に等しくありません.
    NaN === NaN;        // false
    Number.NaN === NaN; // false
    isNaN(NaN);         // true
    isNaN(Number.NaN);  // true
    
    function valueIsNaN(v) { return v !== v; }
    valueIsNaN(1);          // false
    valueIsNaN(NaN);        // true
    valueIsNaN(Number.NaN); // true
    自分のテスト:
    ブール値
  • 次の演算子はブール値を返します.
  • 2元の論理演算子:&((And),𞓜𞓜(Or)
    前の論理演算子:(Not)
    等しい演算子=============!
    比較演算子:>,>=,
  • JavaScriptがある位置がブール値であるべきだと予想している場合、その位置に存在する値をブール値に自動的に変換します.変換規則は、以下の6つの値をfalseに変換する以外、他の値はtrueと見なされる.
  • undefined
    null
    false
    0
    NaN
    "" ''(    )
    なお、空配列([])および空オブジェクト({})に対応するブール値は、いずれもtrueである.
    if ([]) {
      console.log('true');
    }
    // true
    
    if ({}) {
      console.log('true');
    }
    // true