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