オブジェクトは、キーと値のペアのコレクションであり、順序付けされていない複合データセットです。
以下のほとんどはruanyifeng.comからの引用であり、学習メモとしてのみ使用されています。
キー名
オブジェクトのキー名はすべて文字列なので、引用符をつけてもつけなくてもかまいません。キー名が数値の場合は、自動的に文字列に変換されます。
var obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
obj['100'] // true
キー名が識別名として適格でなく、数字でもない場合は、引用符で囲む必要があります。
//
var obj = {
1p: 'Hello World'
};
//
var obj = {
'1p': 'Hello World',
'11': 'Hello World',
111: 'Hello World', //111 文字列への自動変換'h w': 'Hello World',
'p+q': 'Hello World'
};
オブジェクトの各キー名は「プロパティ」とも呼ばれ、その「キー値」はどのようなデータ型でもかまいません。プロパティの値が関数である場合、そのプロパティはしばしば「メソッド」と呼ばれ、関数のように呼び出すことができます。
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
プロパティの値がまだオブジェクトの場合、チェーン参照が形成されます。
var o1 = {};
var o2 = { bar: 'hello' };
o1.foo = o2;
o1.foo.bar // "hello"
オブジェクトの参照
異なる変数名が同じオブジェクトを指している場合、それらはすべてそのオブジェクトへの参照、つまり同じメモリーアドレスを指していることになります。変数の1つを変更すると、他のすべての変数に影響します。
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1
o2.b = 2;
o1.b // 2
この時点では、変数が元のオブジェクトに再参照されても、別の変数には影響しません。
var o1 = {};
var o2 = o1;
o1 = 1;
o2 // {}
しかし、このような参照はオブジェクトに限られ、2つの変数が同じプリミティブ型の値を指している場合、変数はその時点で両方とも値のコピーとなります。この場合、変数は両方ともその時点の値のコピーです。
var x = 1;
var y = x;
x = 2;
y // 1
、属性操作
読む
ドット演算子を使う方法と角括弧演算子を使う方法があります。
var obj = { p: 'Hello World'
};
var foo = p;obj.p // "Hello World"
obj['p'] // "Hello World"
obj[foo] // "Hello World"
存在しないプロパティを削除してもエラーは報告されず、true が返されます。
削除するとエラーが報告されます。
delete
削除できるのはオブジェクト自身のプロパティだけで、継承されたプロパティは削除できません。
var obj = {};
delete obj.p // true
var obj = Object.defineProperty({}, 'p', {
value: 123,
configurable: false
});
obj.p // 123
delete obj.p // false
var obj = {};
delete obj.toString // true
obj.toString // function toString() { [native code] }
オブジェクト自身のすべてのプロパティを見るには、**Object.keys** メソッドを使用します。
**Object.keys **
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
// ['key1', 'key2']
in
オブジェクトがプロパティを含むかどうかのチェック
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
for
ループは、オブジェクトのすべてのプロパティを繰り返し処理するために使用されます。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log(obj[i]);
}
//オブジェクトのプロパティ名を取り出す例
var obj = {
x: 1,
y: 2
};
var props = [];
var i = 0;
for (var p in obj) {
props[i++] = p
}
props // ['x', 'y']
- この走査は、オブジェクトのすべての走査可能なプロパティに対して行われ、走査不可能なプロパティはスキップされます。
- オブジェクト自身のプロパティだけでなく、継承されたプロパティも走査します。
オブジェクトはtoStringプロパティを継承しますが、for.....inループはこのプロパティを繰り返し処理しません。
var obj = {};
// toString プロパティが存在する
obj.toString // toString() { [native code] }
for (var p in obj) {
console.log(p);
} // 出力はない
オブジェクト自身のプロパティだけをたどるには、hasOwnPropertyメソッドを
var person = { name: ' ' };
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name
with
同じオブジェクトの複数のアトリビュートを操作する際の記述の利便性を提供します。
// 例1 既存のプロパティにのみ値を割り当てることができる。
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
p3 = 6
}
obj.p1 = 4;
obj.p2 = 5;
obj.p3//undefined
// 例2 読み方
with (document.links[0]){
console.log(href);
console.log(title);
console.log(style);
}
//
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);