0

オブジェクトのプロパティの存在を確認したい場合、オブジェクトが存在することを確認しなければならないというのはばかげているように思えます。オブジェクトが未定義の場合、そのすべてのプロパティも未定義にする必要があります。

では、なぜ次のような

if ( ! Object.property ) {
    console.log('Nope!')
} else {
    console.log('Yep!')
}

オブジェクトが未定義の場合、完全に壊れますか? プロパティ検証をオブジェクト検証内にネストするのは面倒です。これは常に正当な if ステートメントであるべきではありませんか?

4

4 に答える 4

8

プロパティを検索するには、最初にそのプロパティが定義されているオブジェクトを検索する必要があるため、機能しません。

それがまさにそれです-それは言語デザインの選択です。設計者は、が未定義の場合に常に返されるように定義できたはずですが、そうではありませんでした。a.bundefineda

ショートカットとして、次の構文を使用できます。

if (obj && typeof obj.property !== 'undefined') {
    // yep, it's defined (and not just "falsey")
} else {
    // nope
}
于 2012-08-13T14:24:05.070 に答える
1

まず、オブジェクト自体が定義されているかどうかを確認する必要があります。存在しないオブジェクトのプロパティまたは変数に到達することはできません。そうしないと、ご覧のとおりコードが壊れます。

于 2012-08-13T14:24:05.620 に答える
0

これを単純化したい場合は、Ben AlmangetObjectsetObject:

http://benalman.com/projects/jquery-getobject-plugin/

var myObj = {};

// Setting.
Cowboy.setObject( 'a.b.c', { d: 1, e: 2 }, myObj ); // returns a.b.c reference

// myObj is now { a: { b: { c: { d: 1, e: 2 } } } }

// Getting.
Cowboy.getObject( 'a.b.c.d', myObj ); // returns 1
Cowboy.getObject( 'a.b.c.x', myObj ); // returns undefined
Cowboy.getObject( 'a.b.c.d.x', myObj ); // returns undefined

// Testing.
Cowboy.exists( 'a.b.c.d', myObj ); // returns true
Cowboy.exists( 'a.b.c.x', myObj ); // returns false
Cowboy.exists( 'a.b.c.d.x', myObj ); // returns false

// I'm not sure why you'd want to do something like this, but it's
// certainly possible...
Cowboy.setObject( 'document.body.style.display', 'none' );
Cowboy.getObject( 'document.body.style.display' ); // returns 'none'
于 2012-08-13T14:40:17.137 に答える
0

厳密に言えば、実際にプロパティの存在を確認している場合は、次のコードを使用するのが最善です。

if ( Object && "property" in Object ) {
    // defined
} else {
    // nope
}

その理由は、プロパティが存在する可能性がありますが、「未定義」の値が含まれているためです。

詳細については、こちらを確認してください

于 2012-08-13T14:48:06.400 に答える