代码之家  ›  专栏  ›  技术社区  ›  adamJLev

如何在Javascript中执行“软”if条件检查

  •  4
  • adamJLev  · 技术社区  · 17 年前

    就像您在php中所做的那样:

    if (@$some_var_exists)
        // do stuff
    

    如何在Javascript中执行类似操作而不出错?

    谢谢

    编辑:

    if (someObj.something.foo.bar)
      // This gives an error in the browser if "someObj.something.foo" is not defined.
    
    10 回复  |  直到 17 年前
        1
  •  11
  •   Ryan Watkins    17 年前

    检查链条的每个部分:

    if (someObj && someObj.something && someObj.something.foo && someObj.something.foo.bar) {
       // stuff
    }
    

    因为表达式是从左到右求值的,并且在发现false时立即返回,所以不会导致错误。因此,如果“someObj”存在,但“sometObj.something”不存在,它将返回false,并且永远不会对someObj.something.foo执行会抛出错误的测试。

        2
  •  11
  •   Paolo Bergantino    17 年前

    要检查是否定义了变量,可以执行以下操作:

    if(self.somevar) {
        ...
    }
    

    正如先生在评论中指出的那样 self 这一部分在这里很重要。

    或者,如果您希望更明确,您可以:

    if(typeof somevar != "undefined") {
        ...
    }
    

    您检查PHP变量的方式也不是很整洁,或者实际上不是最佳实践 @ 错误抑制器是昂贵的,在这种情况下不需要。你可以用 isset 这样地:

    if(isset($some_var_here)) {
        ...
    }
    

    编辑 :
    对于你更具体的问题,我认为@Ryan Watkins Response是解决问题的方法,尽管我想知道你为什么要把自己置于这样的境地。:)

        3
  •  4
  •   Matthew Crumley    17 年前

    @Scott Evernden和@Andrew Hedges给出了目前为止唯一完全正确的答案。只是做一些像

    if (variable)
    

    if (someObj && someObj.something && ... && someObj.something.foo.bar)
    

    someObj.something.foo.bar 存在,但为零或false,则条件将为false。只有在 所有属性都是对象 (不是数字、布尔甚至字符串)和 someObj 存在 .

    一般来说,检查是否存在的唯一正确方法是 typeof variable !== "undefined" variable !== undefined (如果你知道已经申报了), "property" in variable ,或者,根据您所说的“存在”的含义, object !== null try/catch

    当你有一条长链条时,不需要检查 正确类型/空/未定义/等的步骤。;只要每个中间值都是一个对象(不是碰巧有额外属性的数字、字符串或布尔值),它们的计算结果就会为true。

    if (typeof someObj !== "undefined" && someObj &&
        someObj.something &&
        someObj.something.foo &&
        typeof someObj.something.foo.bar !== "undefined") {
        // someObj.something.foo.bar exists, but you may need to check for null
    }
    
        4
  •  3
  •   Andrew Hedges    17 年前

    以下内容应该是非常防弹的,但是很麻烦,只有在您事先了解整个链的情况下才有效:

    if ('undefined' !== typeof someObj &&
        'undefined' !== typeof someObj.something &&
        'undefined' !== typeof someObj.something.foo &&
        'undefined' !== typeof someObj.something.foo.bar) {
        // do some stuff
    }
    

    您最好按照Chetan的建议,使用try/catch块:

    try {
        if ('undefined' !== typeof someObj.something.foo.bar) {
            // do some stuff
        }
    }
    catch (e) {}
    
        5
  •  2
  •   Jason Plank Maksim Kondratyuk    14 年前

    比那简单。。

    if(varname){
          ...
    }
    

    这适用于变量,而不是对象。

        6
  •  1
  •   Mister Lucky    17 年前

    当测试变量是否存在时,不应 使用该名称测试变量。在查找深度嵌套对象的属性和方法时,也会出现同样的情况。

    考虑到这一点:

    // error will occur if someObj has not ever been defined in your code.
    if (someObj) {
      // someObj has been defined
    }
    

    您可以通过对全局范围(在浏览器中是窗口级别)进行测试来解决这个问题,并使用最少的代码。

    // safe way to test for global variable.
    if (window.someObj) {
      // someObj has been defined
    }
    

    对全局变量的另一个精细测试是使用内置变量 类型 方法,但如果您必须经常输入,则输入会变得有点乏味。

    // another safe method for testing a global variable
    if (typeof someObj != "undefined") {
      // someObj has been defined
    }
    

    现在开始测试深层嵌套对象(在JS中经常用作伪名称空间)。

    // testing deep nested object
    if (self.someObj && 
        someObj.something && 
        someObj.something.foo && 
        someObj.something.foo.bar) {
      // do something ...
    }
    

    只需为高级编码人员提供最后两个简要说明:

    有时在IE中,我注意到,如果我正在测试,那么执行这种类型的查找/存在测试实际上调用了该方法。如:

    // this is an example, I can't recall which actual methods did this off-hand
    if (document.execCommand) {
      // resultant value of execCommand method gets used to pass/fail the conditional
    }
    

    最后,这些类型的存在查找的一个非常轻微的副作用是,当您将getter应用于该属性时,它实际上会在条件测试期间运行getter。

    // this code only runs in Firefox 2+
    // and is provided for instructional purposes only
    var foo = {
      get bar() { alert("bar getter was executed") }
    };
    if (foo.bar) {
      // a foo.bar property is defined
    }
    
        7
  •  1
  •   Eran    12 年前
    if (typeof somevar === "undefined") {
        // then the variable doesn't exist
    
        8
  •  0
  •   bendewey    17 年前

    var myObj = {};
    if (myObj.someUnknown)
    {
      // will not get here if someUnknown doesn't exist.
    }
    
        9
  •  0
  •   Chetan S    17 年前
    function isVarDefined(str) {
        try { 
            return (typeof eval(str) !== 'undefined');
        }
        catch(e) {
            return false;
        }
    }
    

    将变量名作为字符串传递。例如:

    isVarDefined('someObj.something.foo.bar')
    

    附言:评估是邪恶的。您应该清理str的值,使其仅包含一个变量名,而不是一些任意的可执行代码。留给你做练习吧!

        10
  •  0
  •   Miles    17 年前

    如果需要经常执行此操作,则获取属性(如果该属性存在)并返回未定义属性(否则返回未定义)的函数版本为:

    function propertyChain(root, chain) {
        var properties = chain.split(".");
        var obj = root;
        while (properties.length) {
            if (typeof obj === "undefined" || obj === null)
                return undefined;
            obj = obj[properties.shift()];
        }
        return obj;
    }
    

    以便:

    if (propertyChain(someObj, 'something.foo.bar'))
    

    if (someObj.something.foo.bar)