【问题标题】:Can I use the 'in' keyword to test a property in an (tree) object我可以使用“in”关键字来测试(树)对象中的属性吗
【发布时间】:2014-09-22 20:21:08
【问题描述】:

假设我有以下对象:

Variables.settings.backend.url = 'http://localhost';

我要测试的是url 是否可用,请执行以下操作:

if ('settings' in Variables && 'backend' in Variables.settings && 'url' in Variables.settings.backend) {
  // true
}

这很麻烦。

如果这是 PHP,我可以这样做

if (!empty($variables['settings']['backend']['url']) {
  //true
}

这在 JS 中可以做得更简单吗?

【问题讨论】:

  • 变量['settings']['backend']['url'] !== undefined
  • @BOSS 如果Variables['settings']undefined 然后引发异常

标签: javascript


【解决方案1】:

我写了一个函数来测试这个:

var isModuleDefined = function(moduleName) {
    var d = moduleName.split(".");
    var md = d[0];
    for (var i = 1, len = d.length; i <= len; i++) {
        if (eval("typeof " + md) !== "undefined") {
            md = md + "." + d[i];
            continue;
        }
        break;
    }
    return i === len + 1;
};

isModuleDefined("Variables.settings.backend.url");

但我真的不知道该方法的成本效益,使用 eval。

编辑(没有 eval..):

var isModuleDefined = function(moduleName) {
    var d = moduleName.split(".");
    var base = window;
    for (var i = 0, len = d.length; i < len; i++) {
        if (typeof base[d[i]] != "undefined") {
            base = base[d[i]];
            continue;
        }
        break;
    }
    return i === len;
};

【讨论】:

【解决方案2】:

又一个变种

function isFieldExist(expression){
    var fields = expression.split('.'),
        cur = this;

    for(var i=0; i<fields.length; i++){
        if(typeof cur[fields[i]] === "undefined") return false;
        cur = cur[fields[i]];
    }
    return true;    
}

使用

isFieldExist("Variables.settings.backend.url"); // find in global scope

isFieldExist.call(Variables, "settings.backend.url"); // find in Variables

【讨论】:

  • 比我的解决方案更好,看起来更快
  • @Haketo,jsperf.com 中的天真测试表明速度大致相同:-)
猜你喜欢
  • 1970-01-01
  • 2014-06-12
  • 2013-10-27
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多