Javascriptオブジェクトの操作

4296 ワード

属性のクエリーと設定
1.クエリー
オブジェクトは、点(.)または四角い括弧([])の演算子で属性の値を取得できます.演算子の左側は式であり、オブジェクトを返します.
対応点(.)は、右側が属性名で命名される簡単な識別子である必要があります.四角い括弧([])には、計算結果が文字列である表式が必要です.この文字列は属性の名前です.
    var author = book.author;   //  book "author"  
    var name = author.surname;  //  author "surname"  
    var title = book["main title"]; //  book "main title"  
使用点(.)と四角い括弧([])の違い:
  • 点の右側は命名規則を満たす識別子でなければならない.括弧内の表式は計算結果を文字列に返します.
  • 点の右側の識別子は保留文字ではいけません.例えば、classなど.大かっこでは、キーワードと単語の保持ができます.
  • 2.設定
    属性値を検索する場合と同様に、点と括弧を通して属性を作成したり、属性を与えたりすることができますが、値式の左側に置く必要があります.
        book.edition = 6;   // book      edition   
        book["main title"] = "ECMAScript";  // "main title"    
    3.属性アクセスエラー
    属性アクセスは必ずしも値を戻したり設定したりしません.
    存在しない属性を検索すると、エラーが発生しません.オブジェクトo自身の属性または属性の継承のいずれにも属性xが見つからない場合、属性アクセス式はundefinedに戻ります.
        o.x = underfined;
    ただし、オブジェクトが存在しない場合、ビュークエリーというオブジェクトの属性はエラーとなります.nullとunder finedは属性がないので、これらの値の属性を調べたらエラーが発生します.以下のとおりです
        var len = o.x.length;   //    :underfined    length   
    間違いを避ける二つの方法
        //No. 1         
        var len = underfined;
        if (o) {
            if (o.x) len = o.x.length;
        }
    
        //No.2         ,      x   length      underfined
        var len = o && o.x && o.x.length;
    4.属性の削除
    delete演算子は、オブジェクトの属性を削除することができます.その操作数は属性アクセス式であるべきです.deleteは自由属性のみ削除できます.継承属性は削除できません.継承属性を削除するには、この属性を定義するプロトタイプのオブジェクトから削除しなければなりません.このプロトタイプから継承されたすべてのオブジェクトに影響を与えます.
    意外なことに、deleteは属性と宿主オブジェクトの連絡を切断するだけで、属性の中の属性を操作しない.
        delete book.author;     //book      author
        delete book["main title"];  //book     main title   
    delete戻り値
  • 、delete表現が削除された場合、または存在しない属性を削除するなどの副作用がない場合、trueに戻ります.deleteの後に属性アクセス表式でない場合は、同様にtrueを返します.
    o = {x: 1};     //o    x,     toString
    delete o.x;     //  x,  true
    delete o.x;     //     (x      ),  true
    delete o.toString;      //     (toString     ),  true
    delete 1;       //   ,  true
  • deleteは、これらの構成可能なfalseの属性を削除することができません.いくつかの内蔵オブジェクトの属性は、変数宣言や関数によって作成された大域オブジェクトの属性など、設定できません.厳しいモードでは、設定不可能な属性を削除するとタイプエラーが発生します.非厳密モードでは、これらの場合にはdeleteはfalseに戻る:
    delete Object.prototype;    //    ,        
    var x = 1;      //        
    delete this.x;      //        
    function f() {};        //        
    delete this.f;      //         
  • グローバルオブジェクトの設定可能な属性を非厳格モードで削除すると、グローバルオブジェクトへの参照を省略し、Deleteの後に削除する属性名をそのままフォローすれば良い.
    this.x = 1;     //            (   var)
    delete x;       //    
  • しかし、厳格なモードでは、deleteの後に不正な動作数(例えばx)が続くと、文法エラーが発生します.したがって、指定されたオブジェクトとその属性を表示しなければなりません.
    delete x;       //           
    delete this.x;      //    
  • 4.検出属性
    オブジェクトに属性があるかどうかを検出する方法:
    1.in演算子
    n演算子の左側は属性名(文字列)で、右側はオブジェクトです.オブジェクトの自由属性または継承属性にこの属性が含まれている場合、trueに戻ります.
        var o = {x: 1};
        "x" in o;       //true
        "y" in o;       //false
        "toString" in o;    //true,o  toString  
    2.ハスOwnProperty()
    オブジェクトのhasOwnProperty()メソッドは、ポイントの名前がオブジェクトの自由属性であるかを検出するために使用されます.継承属性に応じてfalseを返します.
        var o = {x: 1};
        o.hasOwnProperty("x");  //true
        o.hasOwnProperty("y");  //false
        o.hasOwnProperty("toString");   //false
    3.propertyIs Enumerable()
    propertyIs EnumerableはhasOwnPropertyの拡張版で、その時の自由属性を検出して、しかもこの属性のエニュメレーション性がtrueの時に戻ってきます.
        var o = inherit({y:2});
        o.x = 1;
        o.propertyIsEnumerable("x");    //true
        o.propertyIsEnumerable("y");    //false
    4.使う!==「アンダーフィールド」
    もう一つ簡単な方法があります.「属性がunder finedかどうかを判断します.自由属性でも相続属性でも、trueに戻ります.
        var o = {x:1};
        o.x !== "underfined";       //true
        o.y !== "underfined";       //false
        o.toString !== "underfined";        //true
    in演算子との違い:
    inは存在しない属性と存在しますが、値はundefinedの属性と区別できます.==できません.
    var o={x:undefined}
    o.x!==「undefined」//false:属性は存在しますが、値はundefinedです.
    o.y!==「undefined」//false:属性は存在しません.
    「x」in o//true
    “y”in o//false
    delete o.x/削除属性x
    "x"in o//false:属性は存在しません.
    上記のコードでは!==演算子ではなく!==はundefinedとnullを区別できます.このような区別は必要ない場合があります.