javascriptのfor inとin演算子
9300 ワード
for inループがあることだけは知っていましたが、in演算子は分かりません.for inとinはオブジェクトを遍歴してプロトタイプに追加された属性も遍歴されます.
n演算子の規則:演算子の左右の2つの操作数に対する要求は厳しいです.n演算子は、1番目(左)の演算数が文字列タイプでなければなりません.または文字列タイプに変換できる他のタイプでなければなりません.2番目(右)の演算数は、配列、オブジェクト、またはnewで生成されるオブジェクトでなければなりません.1番目の操作数の値だけが2番目の操作数の属性名です.trueに戻ります.そうでないとfalseに戻ります.
for inとin演算子のkeyはオブジェクトの属性であり、Arayでは配列の索引です.
for in
注意事項:一般的なオブジェクト属性には、属性の名称を文字列で指定する必要があります. inは、左側演算数が右演算数のメンバ であるかどうかを判断する. instance of判定対象があるクラスまたは構造関数 に属するかどうか newは、構造関数に基づいて新しいオブジェクトを作成し、オブジェクト を初期化する. deleteは、指定されたオブジェクトの属性、配列要素または変数 を削除する..および[]アクセス対象と配列要素は、keyが変数varに割り当てられている場合、[var] を使用することができます.()関数呼び出し、演算子優先度の変更などの
n演算子の規則:演算子の左右の2つの操作数に対する要求は厳しいです.n演算子は、1番目(左)の演算数が文字列タイプでなければなりません.または文字列タイプに変換できる他のタイプでなければなりません.2番目(右)の演算数は、配列、オブジェクト、またはnewで生成されるオブジェクトでなければなりません.1番目の操作数の値だけが2番目の操作数の属性名です.trueに戻ります.そうでないとfalseに戻ります.
for inとin演算子のkeyはオブジェクトの属性であり、Arayでは配列の索引です.
for in
var obj = {
"key1":"value1",
"key2":"value2",
"key3":"value3"
};
function enumeKey(){
for(var key in obj ){
console.log(key);
}
}
enumeKey() //key1 key2 key3
配列のエルゴードは順序を保証できないので、なるべく使わないようにします.for-i-nは配列以外のオブジェクトのエルゴードに循環します.for-iを使って循環します.「列挙」とも呼ばれます.したがって、最も良い配列は正常なforサイクル(ECMA-622標準のfor eachも使用できます)を使用し、オブジェクトはfor-iループを使用します.//
var man = {
hands: 2,
legs: 2,
heads: 1
};
//
//
if (typeof Object.prototype.clone === "undefined") {
Object.prototype.clone = function () {};
}
上のコードには、対象の字面量を使って定義されたmanというオブジェクトがあります.マン定義が完了した後のあるところに、オブジェクトの原型に、clone(という)という有用な方法が追加されました.このプロトタイプチェーンはリアルタイムであり、これはすべてのオブジェクトが自動的に新しい方法にアクセスできることを意味する.エニュメレーションマンの時にclone()の方法が現れることを避けるために、ハスOwnProperty()の方法を使って原型の属性をフィルタリングする必要があります.フィルタリングをしないと、clone()関数が表示されます.ほとんどの場合、これは望ましくないです.// 1.
// for-in
for (var i in man) {
if (man.hasOwnProperty(i)) { //
console.log(i, ":", man[i]);
}
}
/* hands : 2 legs : 2 heads : 1 */
// 2.
// :
// for-in loop without checking hasOwnProperty()
for (var i in man) {
console.log(i, ":", man[i]);
}
/* hands : 2 legs : 2 heads : 1 clone: function() */
もう一つはハスOwnProperty()を使用する形でObject.prototypeをキャンセルする方法であり、ハスOwnPropertyをマンオブジェクトに再定義する場合にネーミング衝突を避けることが利点である.for (var i in man) {
if (Object.prototype.hasOwnProperty.call(man, i)) { //
console.log(i, ":", man[i]);
}
}
// , ,jquery
var i, hasOwn = Object.prototype.hasOwnProperty;
for (i in man) {
if (hasOwn.call(man, i)) { //
console.log(i, ":", man[i]);
}
}
javascriptのin演算子注意事項:一般的なオブジェクト属性には、属性の名称を文字列で指定する必要があります.
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // returns true
"model" in mycar // returns true
// ( , length)。
// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees // returns true
3 in trees // returns true
6 in trees // returns false
"bay" in trees // returns false (you must specify the index number,
// not the value at that index)
"length" in trees // returns true (length is an Array property)
//in , : String , :
var color1 = new String("green");
"length" in color1 // returns true
var color2 = "coral";
"length" in color2 // generates an error (color is not a String object)
// delete , in , false, :
var mycar = {make: "Honda", model: "Accord", year: 1998};
delete mycar.make;
"make" in mycar; // returns false
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // returns false
// undefined, delete , in , true.
var mycar = {make: "Honda", model: "Accord", year: 1998};
mycar.make = undefined;
"make" in mycar; // returns true
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // returns true
javascriptオブジェクト演算子