【Javascript】 in演算子
問題
inって演算子なんですか。
答え
in単体だと演算子です(for-inのはそういう"構文")。
あまり見かけないけど、こういう書き方ができる。
Example
if ("xxx" in obj) {
//obj に xxx プロパティがあるとき
//...
}
Example
("xxx" in obj) ? alert('obj.xxx あり') : alert('obj.xxx なし');
ただ、以下の書き方でだいたい事足りるので、あまり使われない。
if (obj.xxx) {
//...
}
「プロパティが存在するかどうか」と、「プロパティの値が真かどうか」という意味合いの違いはある。
/**
* 準備
*/
var o = {};
o.aaa = 123;
o.bbb = null;
o.ccc = undefined;
/**
* test 1 : プロパティがあって値が何か入っていれば
*/
("aaa" in o) ? alert('o.aaa あり') : alert('o.aaa なし'); //ありになる
if (o.aaa) {
alert('o.aaa は真でした'); //ここを通る
}
/**
* test 2 : プロパティがあるけど値がnullだと
*/
("bbb" in o) ? alert('o.bbb あり') : alert('o.bbb なし'); //ありになる
if (o.bbb) {
alert('o.bbb は真でした');
} else {
alert('o.bbb は偽でした'); //こちらを通る
}
/**
* test 3 : プロパティがあるけど値がundefinedだと
*/
("ccc" in o) ? alert('o.ccc あり') : alert('o.ccc なし'); //ありになる
if (o.ccc) {
alert('o.ccc は真でした');
} else {
alert('o.ccc は偽でした'); //こちらを通る
}
/**
* test 4 : プロパティがない
*/
("ddd" in o) ? alert('o.ddd あり') : alert('o.ddd なし'); //これは なしになる
if (o.ddd) {
alert('o.ddd は真でした');
} else {
alert('o.ddd は偽でした'); //もちろん こちらを通る
}
プロパティをundefinedにするのではなくて、プロパティを削除する場合は、deleteを使う。
Example
delete obj.xxx;
プロパティの値の問題ではなく、プロパティの有無を見たいときは、in と delete で。
http://www.ecma-international.org/publications/standards/Ecma-262.htm