SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【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

関連するメモ

コメント