【问题标题】:Dependent Object Type Check Javascript Seems Redundant依赖对象类型检查 Javascript 似乎是多余的
【发布时间】:2015-02-12 21:14:17
【问题描述】:

有更好的方法吗?

如果我这样做:

    if(typeof someObject[bar][foo] == "function"){
        // Do something
    }

如果bar 不存在,我得到一个someObject[bar][foo] is not an object 错误,它指的是someObject[bar]。这意味着代码假定您知道someObj[bar] 已定义。所以我的解决方案是这样的:

if(typeof someObj[bar] === "object"){
      if(typeof someObject[bar][foo] == "function"){
        // Do something
    }
}

如果我们想努力减少代码行并制作好的、干净、可读的代码,那么看起来就显得多余和丑陋了。有没有更好的方法来做到这一点而不必经过两个if 点?我知道这没什么大不了的,但我想知道是否有更好的方法。

【问题讨论】:

  • 你试过if (someObj.hasOwnProperty(bar)){}吗?没有附加条件......当然
  • 检查这个 fddle jsfiddle.net/4rjjxdzh
  • @PashaB,这就是我的意思:jsfiddle.net/powerphillg5/mobsrut5看日志。
  • @TimVermaelen 确实如此,但之后您是否还需要检查该函数是否存在于该属性中?我的意思是,你会假设 typeof 会返回 "undefined" 如果它应该存在的方法和属性都不存在你知道吗?
  • @FelipeTadeo 你在寻找类似if(someObj[bar] && typeof obj[bar][foo] === 'function') 的东西吗?第一个条件检查元素不是 undefined,null,0... 如果满足,则检查另一部分以查看 foo 是否是一个函数。

标签: javascript object if-statement typeof


【解决方案1】:

恐怕没有简单的解释。

您希望对象在哪种情况/情况下有条件地表现?给你举个例子,我用什么……去高级……并试图同时尽可能简单……

  • 您是否正在循环遍历一整套类似对象的数组?
  • 你能相信这个对象,所以你已经知道会发生什么吗?
  • 不同数据类型的对象比较?

.[我需要一些编辑:s]

/**
  * @description Get an object from a list of objects by searching for a key:value pair
  * @param {Object} obj : -literal, json
  * @param {String} val : the value you seek
  * @param {String} key : the key
  * @param {Boolean} isTypeComparison : if set to true, the key and value will be checked against it's type as well
  */
  getObjectProperty: function (obj, val, key, isTypeComparison) {
      var property, o;

      for (property in obj) {
          if (obj.hasOwnProperty(property)) {
              if (typeof obj[property] === 'object') {
                  o = this.getObjectProperty(obj[property], val, key);
                  if (o) {
                      break;
                  }
              } else {
                  // found a property which is not an object
                  if (isTypeComparison) {
                      if (property === key && obj[property] === val) {
                          // we got a match
                          o = obj;
                          break;
                      }
                  } else {
                      if (property == key && obj[property] == val) {
                          // we got a match
                          o = obj;
                          break;
                      }
                  }
              }
          }
      }

      return o || undefined;
  },

要为您的问题添加某种价值,在上述所有这些循环中,您会看到与期望的斗争。我已使用此代码搜索附加到列表的 ajax 联系人列表。所以你肯定需要编写更多的代码来满足深度和信任的要求。

【讨论】:

    【解决方案2】:

    如果您概括您的问题,您基本上是在询问您是否可以验证对象中的某种“路径”是否合法。我这样做的方法是使用一个接受对象和所需“路径”的函数:

    function has(obj, path){
        var temp = obj;
        var path = path.split('.');
        for(var i = 0; i < path.length; i++){
            if(temp[path[i]])
                temp = temp[path[i]];//path still exists
            else
                return false;//path ends here
        }
        return true;//the whole path could be followed
    }
    

    此示例使用作为 'bar.foo' 传递的路径,但您可以轻松调整数组 ['bar','foo'] 或使其传入的参数数量可变。

    这将成为你的榜样:

    if(has(someObject, bar + '.' + foo)){
        if(typeof someObject[bar][foo] == "function"){
            // Do something
        }
    }
    

    虽然这不会具体减少此示例,但如果您有更长的搜索路径,这可能会显着减少链接在一起的 if 语句。

    你可以修改函数,让它返回路径指定的值,如果它存在而不是 true,这样你就只处理一行:

    function get(obj, path){
        var temp = obj;
        var path = path.split('.');
        for(var i = 0; i < path.length; i++){
            if(temp[path[i]] !== undefined)
                temp = temp[path[i]];//path still exists
            else
                return undefined;//path ends here
        }
        return temp;//the whole path could be followed
    }
    
    if(typeof get(someObject, bar + '.' + foo) === 'function'){
        //do something
    }
    

    【讨论】:

    • 数组的缩小版本作为第二个参数:函数 get(o,p){for(i=0;i
    【解决方案3】:
    if( someObject.bar && someObject.bar.foo && typeof someObject.bar.foo === "function" ){
        ...
    }
    

    或相同但具有更好的可见性符号样式:

    if( someObject.bar 
        && someObject.bar.foo 
        && typeof someObject.bar.foo === "function" ){
           ...
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2022-09-24
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多