***

7307 ワード

ECMAScript 5.1(またはES 5のみ)は、ECMAScript(JavaScriptの仕様に基づく)規格の最新の修正です.HTML 5仕様プロセスの本質と同様に、ES 5は既存のJavaScriptメソッドに文を追加し、元のECMAScriptオブジェクトを統合することで標準化されています.
ES 5の厳格モード(strict mode)
JSファイルまたは関数の上部(文なし、注釈あり)に"use strict";を追加すると、厳格モードが有効になります.
//        
    "use strict";

//          
    function asd(){ 
      "use strict";
        //code...
    }

厳格なモードを開くためのいくつかの注意
  • グローバル変数変数明示的に宣言変数名のスペルミスは例外を放出します(通常モードでは新しいグローバル変数が作成され、後でエラーが報告される可能性があります)
  • for (i=0; i<5; i++) {code}  //      
    
  • 通常モードでサイレントに失敗した割り当て操作(書き込み不可属性に値を割り当て、読み取り専用属性(getter-only)に値を割り当て、拡張不可オブジェクトの新しい属性に値を割り当てる)は、例外(通常モードではヒントなし)
  • を放出します.
    "use strict";
    //         
    var obj1 = {};
    Object.defineProperty(obj1, "x", { value: 42, writable: false });
    obj1.x = 9; //   TypeError  
    //        
    var obj2 = { get x() { return 17; } };
    obj2.x = 5; //   TypeError  
    //              
    var fixed = {};
    Object.preventExtensions(fixed);
    fixed.newProp = "ohai"; //   TypeError 
    
  • 厳格モードでは、削除できない属性を削除しようとすると異常(通常モードではヒントなし)
  • が投げ出す.
    "use strict";
    delete Object.prototype; //   TypeError  
    
  • オブジェクト内のすべての属性名は、オブジェクト内で一意でなければならない(通常モードでは前者を上書きする)
  • .
  • 1 1つの関数内のすべてのパラメータ名は、関数内で一意でなければならない(通常モードで複数の重複するパラメータがある場合はarguments[i]で読み取ることができる)
  • .
  • 関数は最上位に宣言する必要があり、非関数のコードブロック内で関数
  • を宣言することは許されない.
  • 厳格モードでは、変数を直接削除することはできません.
  • を削除できるのはconfigurableがtrueに設定されているオブジェクト属性のみです.
    JSON
    ES 5は、シーケンス化(JSOn.stringify)および逆シーケンス化(JSOn.parse)オブジェクトがJSON形式であるグローバルJSONオブジェクトを提供する.
  • JSON.stringify
  •     JSON.stringify(value [, replacer [, space]])
    

    ECMAScript値を受け入れてJSON形式の文字列に変換できます.その最も簡単な形式の中で、JSON.stringifyは値を受け入れて文字列を返します.
        var asd = JSON.stringify({a: "1"})  //undefined
    
        typeof asd; //"string"
    
        console.info(asd);// '{"a": "1"}'
    

    値文字列化の方法を変更したり、選択したフィルタリングを提供したりする必要がある場合は、replacer関数に渡すことができます.replacerメソッドがundefinedを返す場合、キー値ペアは最終的なJSONに含まれません.
    var asd = { 'a': 1, 's': 2,'d':3}
    var as = JSON.stringify(asd, function(key, value){ 
    //                3   
        if (value == 3) { 
            return undefined; 
        } else { 
            return value; 
        }
    });
    console.info(as);
    // ' { "a": 1, "s": 2}'
    

    同様にspaceパラメータを渡して、結果を返す可読性の助けを得ることができます.スペースパラメータは、インデントされたJSON文字列または文字列の水平インデント当たりのスペース数を示す数値であってもよい.パラメータが10を超える数値、または10文字を超える文字列の場合、数値10または最初の10文字を切り取ることになります.
    var asdf =  {  "a": 1, "s": 2, "d":3, "f":4'}
    var as2 = JSON.stringify(asdf, function(key, value) { 
        if (value == 3) {
            return undefined; 
        } else { 
            return value; 
        }
    }, 2);
    console.info(as2);
    // '{ 
        "a": 1, 
        "s": 2, 
        "f":4
    }'
    
  • JSON.parse
  •      JSON.parse(text [, reviver])
    

    テキスト(JSON形式)を受け入れ、ECMAScript値に変換します.オプションのreviverパラメータはkeyとvalueの2つのパラメータを持つ関数で、結果に作用します.フィルタリングと戻り値の変換が可能になります.
        var result = JSON.parse('{"a": 1, "b": "2"}');//Object 
    
        result.b//"2"
    

    解析した値が整数であることを確認するには、reviverメソッドを使用します.
        var result = JSON.parse('{"a": 1, "b": "2"}', function(key, value){ 
            if (typeof value == 'string'){ 
                return parseInt(value); 
            } else { 
                return value; 
            }
        });
        result.b //2
    

    新しい配列メソッド
    次の方法はArrayに追加されました.prototypeオブジェクト上(isArrayを除く)
    indexOf
    類似文字列のindexOf()メソッド
    stringObject.indexOf(searchvalue,fromindex)
    
    var data = [2, 5, 7, 3, 5];
    console.log(data.indexOf(5, "x")); // 1 ("x"   )
    console.log(data.indexOf(5, "3")); // 4 ( 3      )
    console.log(data.indexOf(4)); // -1 (   )
    console.log(data.indexOf("5")); // -1 (   ,  5 !== "5")
    

    lastIndexOf
    indexOf()のような方法(順序が逆)
    forEach
    ArrayがES 5に追加したメソッドでは、パラメータはすべてfunctionタイプで、デフォルトではパラメータ(遍歴した配列の内容、対応する配列インデックス、配列自体)があります.
    [].forEach(function(value, index, array) {
        // ...
    });
    

    forEachメソッド配列要素の遍歴
    var colors = ['red', 'green', 'blue'];
    colors.forEach(function(color) { 
        console.log(color);
    });
    

    forEachは、必要なコールバック関数パラメータのほかに、オプションのコンテキストパラメータ(コールバック関数のthisの方向を変更する)(2番目のパラメータ)を受け入れることができます.この2番目のオプションパラメータが指定されていない場合は、グローバルオブジェクトの代わりに(ブラウザではwindow)、厳格なモードではundefinedまで使用します.
    array.forEach(callback,[ thisObject])
    

    map
    マッピング(一対一対応).[].map();基本的な使い方はforEachの方法と似ています.
    array.map(callback,[ thisObject]);
    

    ただしcallbackにはreturn値が必要です(ない場合はundefinedを返すようにします)
    var a1 = ['a', 'b', 'c'];
    var a2 = a1.map(function(item) { 
        return item.toUpperCase(); 
    });
    console.log(a2); // logs A,B,C
    

    filter
    フィルタフィルタリング(callbackはここでフィルタの役割を果たし、要素が条件に合致するとフィルタはtrueを返し、filterはフィルタ条件に合致するすべての要素を返します).
    array.filter(callback,[ thisObject]);
    

    インデックスグループfilterの後、フィルタされた新しい配列を返します.使い方はmapに似ています
    var a1 = ['a', 10, 'b', 20, 'c', 30];
    var a2 = a1.filter(function(item) { 
        return typeof item == 'number'; 
    });
    console.log(a2); // logs 10,20,30
    

    every
    every(callback[,thisObject])配列内の各要素がcallback上でtrueを返すとtrueが返されます.
    function isNumber(value){ 
        return typeof value == 'number';
    }
    var a1 = [1, 2, 3];
    console.log(a1.every(isNumber)); // logs true
    var a2 = [1, '2', 3];
    console.log(a2.every(isNumber)); // logs false
    

    some(または)
    some(callback[,thisObject])は、配列の1つがcallback上でtrueを返す限り、trueを返します.
    function isNumber(value){ 
    return typeof value == 'number';
    }
    var a1 = [1, 2, 3];
    console.log(a1.some(isNumber)); // logs true
    var a2 = [1, '2', 3];
    console.log(a2.some(isNumber)); // logs true
    var a3 = ['1', '2', '3'];
    console.log(a3.some(isNumber)); // logs false
    

    reduce(左から右への累積)
    配列内のすべての要素に対して指定したコールバック関数を呼び出します.コールバック関数の戻り値は累積結果であり、この戻り値は、次回コールバック関数が呼び出されるときにパラメータとして提供されます.
    var a = [10, 20, 30];
    var total = a.reduce(function(first, second) { 
        return first + second; 
    }, 0);
    console.log(total) // Prints 60
    

    reduceRight(右から左へ加算)
    reduceの役割は完全に同じで、唯一の違いは、reduceRightが配列を右から左に遍歴する要素であることです.
    ArrayコンストラクタのisArray
    Array.isArrayはprototypeオブジェクトではなくArrayコンストラクタに直接書かれています.Array.isArrayは、パラメータの[[Class]]内部属性が「Array」であるか否かに基づいてtrueまたはfalseを返す.
    Array.isArray("NO U")
    falseArray.isArray(["NO", "U"])// true
    

    Array.prototype.slice.call
    実際の配列にはsliceメソッドがあり、配列を浅いコピー(元の配列に影響を与えない)することができ、返されるのは配列です.類似配列にはlengthプロパティがあり、forループを使用できますが、sliceメソッドを直接使用することはできません.エラーが発生します.でもアリーを通してprototype.slice.callは間違いなく報告され、自身(類似配列)は最初から最後までsliceにコピーされた--真実の配列になった!argumentsなどの配列に似たオブジェクトを実際の配列に変換
    Array.prototype.slice.call(arguments)
    

    bind関数拡張