4

私は現在、フロー制御の例外に頼るコードが散らばっている大規模なJavascriptコードベースで作業しています

function getChecklistUrl() {
    try {
        return dataLayerObject.config.checklist;
    } catch (e) {
        try {
            console.error('dataLayer', e);
        } catch (ignore) {}
    }
}

同じ関数のこの実装などの条件付きロジックを好むかもしれません

function getChecklistUrl() {
    if(typeof dataLayerObject == 'object'        &&
       'config' in dataLayerObject               &&
       typeof dataLayerObject.config == 'object' &&
       'checklist' in dataLayerObject.config     &&
       typeof dataLayerObject.config.checklist == 'object') {
        return dataLayerObject.config.checklist;
    }
    return null;
}

後者は長ったらしく感じますが、ヘルパー関数を記述して、そのようなチェックのボイラープレートを減らすことができます。

前者はJavascriptの慣用的なものですか? 後者は(ブラウザ/シナリオ全体で)脆弱であり、とにかくtry/に任せた方がよいですか?catchそれとも前者は単に怠惰の証拠ですか?

編集

これらのオブジェクトは「プレーンな」オブジェクトであると推定されるvar obj = {}ため、ここでプロトタイプ チェーンを気にする必要はないと思います。

4

4 に答える 4

6

JavaScript でオブジェクト プロパティを確認する適切な方法は、Object.hasOwnProperty()メソッドです。

例:

var Person = {
  first_name: 'Fred',
  last_name: 'Flintstone'
};

if ( 'object' === typeof Person && Person.hasOwnProperty('first_name' ) {
  window.alert('the property exists!');
}

編集

ネストされたオブジェクトのプロパティを確認するには、次のようなことを試すことができます。

function checkNested(obj /*, level1, level2, ... levelN*/) {
  var args = Array.prototype.slice.call(arguments, 1);

  for (var i = 0; i < args.length; i++) {
    if (!obj || !obj.hasOwnProperty(args[i])) {
      return false;
    }
    obj = obj[args[i]];
  }
  return true;
}

var test = {level1:{level2:{level3:'level3'}} };

checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
于 2015-11-12T16:10:04.483 に答える
0

短くしたい場合は、このようなことを行うことができますが、dataLayer がオブジェクトであるかどうかはチェックされないため、構成とチェックリストを持つ関数の場合は、それも返されます。しかし、これはカスタム オブジェクトであるため、問題にならない可能性があります。必要に応じて「in」または「hasOwnProperty」チェックを追加するか、必要に応じて三項を使用できます。

var getChecklistUrl = function getChecklistUrl() {
    return dataLayerObject && dataLayerObject.config && dataLayerObject.config.checklist || null;
}
于 2015-11-12T16:15:50.983 に答える
0

キャストを利用することで、いつでも短縮できます。

if ( typeof dataLayerObject == 'object' &&
     dataLayerObject.config &&
     dataLayerObject.config.checklist &&
     typeof dataLayerObject.config.checklist == 'object') {
  // do something
}

チェックリストが実際にオブジェクトであることを本当に確認する必要がない場合は、最後のtypeof. typeof変数はグローバルのように見えるため、最初の変数が必要です。

于 2015-11-12T16:16:04.713 に答える