HTML5プロフェッショナル認定資格Level.2 覚えるべきことまとめ <文法>

Html5プロフェッショナル認定資格 Level2に向けての勉強したことをまとめていこうと思います
実際の試験はもっと考える問題が多いですが、そこまでの最低限の知識として、
意外と細かい文法までは把握できていないので、以下をまとめました

# 変数
* 宣言
    * 例： var xxx;
    * var を省略するとグローバル変数になる
* 制限
    * 予約語(以下)でないこと
        * 予約語
            * break finally this do return with instanceof void defalt
            * typeof continue if case for throw else switch delete new 
            * while in var debugger try catch function
        * 将来の予約語
            * implements public package let yield protected private interface static
    * 最初の文字は 「英字」「アンダースコア(_)」「ドル記号($)」のいずれか
    * 2文字目以降は 「英字」「アンダースコア(_)」「ドル記号($)」「数字」のいずれか

# 型

* JavaScriptは明示的に型指定はできないが、型を持っている (以下9種類)
    * プリミティブ型 (値を持つ)
        * 未定義型: 値が未定義であることを示す1つの値
        * Null値型: 値がNull値であることを表す1つの値
        * 論理型: true(真), false(偽)の2つの値
        * 文字列型: 「""」もしくは「''」で囲われている (はじめと終わりが一致していたらどちらでもok)文字列
        * 数値型: 123, 0.111 などの数値
            * 整数型、実数型などの区別はない
    * その他 (値を持たず、値の格納先を示す参照を持つ)
        * オブジェクト型: オブジェクト
        * 参照型: 参照型
        * List型: Array型(配列型)
    * Completion型(The Completion Specification Type)
        * Javascriptのステートメントの状態(brake, continue, return, throw)

# 型変換

* 型が異なる変数間の演算結果はルールに従って自動的に型が変換される
* 例： 数字型への変換(それぞれ以下のように自動変換される)
    * 未定義型 → NaN
    * Null値型 → +0
    * 論理型 → trueの場合は「1」 falseの場合は「0」
    * 数値型 → 変換しない
    * 文字列型 → 数値(8, 10, 16進)のみ数値、それ以外は NaN
    * オブジェクト型 → オブジェクト.toNumber() で数値を取得

# 特殊数値

Javascriptで扱う数値には数値と特殊数値がある

* 特殊数値
    * Number.POSITIVE_INFINITY
        * Infinity または + Infinity
        * 正の無限数値
    * Number.NEGATIVE_INFINITY
        * -Infinity
        * 負の無限数値
    * Number.NaN
        * IEEE 754 で定義される存在しない数値
        * "Not-a-Number" value
    * Number.MAX_VALUE
        * 正の最大値(1.7976931348623157 × 10^308)
    * Number.MIN_VALUE
        * 最小の正の数の値(5 × 10^-324)
      
# Strictモード

* JavaScriptの言語仕様には曖昧なところがある
    * 分かりにくいエラーになったりする
* そこで、厳格な(Strict)チェックを実行するもの
    * エラーを早急に発見したり適切な最適化を可能にして処理を高速化する
* Strictモードへの切り替え
    * 「"use strict";」を追加する
    * ソースコードの先頭に記述 
        * ソースコード全体に適用
    * 関数の先頭に記述
        * 関数内に適用

# 式
* 特殊演算子
    * delete
        * オブジェクトの中のプロパティを削除
        * 例: delete object.property
    * set
        * 擬似プロパティの設定(setter)の定義
        * 例: set property1(param1){this.status=param1}
    * get
        * 擬似プロパティの取得(getter)の定義
        * 例: get property1{return this.status}
    * in
        * プロパティの存在チェック
        * 例: property1 in object //true or false で返ってくる 
    * in
        * イテレータ(プロパティ分繰り返し)
        * 例: for(i in object){...}
    * void
        * 式を評価(実行)し常にundefinedを返す
        * 例: void(式)
    * new
        * コンストラクタ
        * 例: new object
    * instanceof
        * 指定されたコンストラクタで生成されたオブジェクトかチェック
        * 例: おbじぇct instanceof classx //true or false で返ってくる 
    * this
        * thisが記述されたオブジェクト(コンテキスト)
        * 例: return this.property1;
    * function
        * 関数を定義
        * 例: function(param1){console.log(param1);}
    * typeof
        * データ型取得
        * function(param1){console.log(param1);}
    * yield
        * ジェネレーター関数における制御
        * 以下に記述
   
* yieldの使用例
    * 乱数を返す関数など呼び出されるたびに異なる値を返す関数を**ジェネレータ関数**という
    * ジェネレータ関数でreturn文のように処理を戻すものがyield文
    * ちなみに**yield文は試験範囲外**

# 配列

* 配列には複数の値を入れることができる
* 添え字を文字列にできる(連想配列)

* 配列変数
    * プロパティ
        * length
            * 配列の要素(index)数
    * メソッド
        * join()
            * 指定した文字で配列内の要素を連結した文字列を返す

        ```JavaScript:join.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.join("&")); // 結果→"foo&bar&hoge"
        ```

        * reverse()
            * 配列内の順序を入れ替え

        ```JavaScript:reverse.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.reverse()); // 結果→["hoge", "bar", "foo"]
        ```

        * sort()
            * 配列内の要素の並び替え
            * パラメーターにソート手順を関数として定義もできる

        ```JavaScript:sort.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.sort()); // 結果→["bar", "foo", "hoge"]
        ```

        * pop()
            * 配列の末尾から要素を削除

        ```JavaScript:pop.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.pop()); // 結果→"hoge" 削除された最後の要素
        console.log(n);       // 結果→["foo", "bar"] 最後の要素が削除された配列 
        ``` 

        * push()
            * 配列の末尾に要素を追加

        ```JavaScript:push.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.length());   // 結果→3
        console.log(n.push("zzz"));
        console.log(n);            // 結果→["foo", "bar", "hoge", "zzz"] 
        console.log(n.length());   // 結果→4
        ``` 

        * concat()
            * 配列同士を連結した結果を返す

        ```JavaScript:concat.js
        var n = ["foo", "bar", "hoge"];
        var x = ["aaa", "bbb", "ccc"];
        console.log(n.concat(x)); // 結果→["foo", "bar", "hoge", "aaa", "bbb", "ccc"] 
        console.log(n);           // 結果→["foo", "bar", "hoge"] 元の配列は変更されてない 
        ```

        * slice()
            * 配列内の一部の連結した要素の切り出し

        ```JavaScript:slice.js
        var n = ["a", "b", "c", "d", "e", "f"];
        console.log(n.slice(1,4)); // 結果→["b", "c", "d"] n[1]〜n[3]を取り出し(n[4]は含まない)
        ```

        * splice()
            * 配列内の一部の連結した要素の削除/置換

        ```JavaScript:splice.js
        var n = ["a", "b", "c", "d", "e", "f"];
        console.log(n.splice(2,3)); // 結果→["c", "d", "e"] 削除したn[2]〜n[4]を返す
        console.log(n);             // 結果→["a", "b", "f"] 削除後の配列

        var n = ["a", "b", "c", "d", "e", "f"];
        console.log(n.splice(2,3), "foo", "bar"); // 結果→["c", "d", "e"] 削除したn[2]〜n[4]を返す
        console.log(n);                           // 結果→["a", "b", "foo", "bar", "f"] 削除したところに挿入
        ```

        * shift()
            * 配列の先頭の要素を削除

        ```JavaScript:shift.js
        var n = ["a", "b", "c", "d", "e", "f"];
        console.log(n.shift()); // 結果→"a" 削除したn[0]を返す
        console.log(n);         // 結果→["b", "c", "d", "e", "f"] 削除後の配列
        ```

        * unshift()
            * 配列の先頭に要素を追加

        ```JavaScript:unshift.js
        var n = ["foo", "bar", "hoge"];
        console.log(n.unshift("aaa", "bbb")); // 結果→"5 追加後の要素数
        console.log(n);                       // 結果→["aaa", "bbb", "foo", "bar", "hoge"]
        ```

        * toString()
            * 配列内のすべての要素を文字列化した結果を返す
 
        ```JavaScript:toString.js
        var n = ["111", "222", "333"];
        console.log(n);            // 結果→[111, 222, 333]
        console.log(n.toString()); // 結果→"111, 222, 333"
        ```

        * toLocaleString()
            * 配列内のすべての要素を言語や文化に合わせて文字列化した結果を返す

        ```JavaScript:toLocaleString.js
        var d = [new Date(1975, 2, 14), new Date(2014, 7, 31)];
        console.log(d.toString());       // 結果→"Fri Mar 14 1975 00:00:00 GMT+0900 (JST),Sun Aug 31 2014 00:00:00 GMT+0900 (JST)"
        console.log(d.toLocaleString()); // 結果→"1975/3/14 0:00:00,2014/8/31 0:00:00"
        ```