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

时间:2009-03-27 18:05:42

标签: javascript

就像你在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 个答案:

答案 0 :(得分:11)

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

if(self.somevar) {
    ...
}

正如Mister在评论中所指出的,self部分在这里很重要。

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

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

检查PHP var的方式也不是很整洁或者是最佳实践,因为@错误抑制器很昂贵,在这种情况下不是必需的。您可以像这样使用isset

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

修改
对于你更具体的问题,我认为@Ryan Watkins的答案就是这样做的方法,虽然我不得不想知道你为什么要把自己置于这样的位置。 :)

答案 1 :(得分:11)

检查链条的每个部分:

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

因为表达式是从左到右计算的,并且在找到false后立即返回,所以它不会导致错误。因此,如果“someObj”存在,但“sometObj.something”不存在,则它将返回false并且永远不会执行将导致错误的someObj.something.foo的测试。

答案 2 :(得分:4)

@Scott Evernden和@Andrew Hedges到目前为止只有完全正确的答案。只做像

这样的事情
if (variable)

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

通常不正确,因为如果someObj.something.foo.bar存在但是为零或为假,则条件为false。它仅在所有属性为对象(不是数字,布尔值,甚至字符串)且 someObj存在时才有效。

检查一般存在的唯一正确方法是typeof variable !== "undefined"variable !== undefined(如果您知道它已被声明),"property" in variable,或者,取决于您的意思“存在“,object !== nulltry/catch也可以工作,但这看起来很混乱。

当你有一个长链时,没有必要检查每个步骤是否有正确的类型/ null / undefined / etc.只要每个中间值都是一个对象(不是一个碰巧有额外属性的数字,字符串或布尔值),它们就会被评估为真。

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
}

答案 3 :(得分:3)

以下内容应该是非常防弹的,但是如果你事先了解整个链条,那么这只会很麻烦:

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) {}

答案 4 :(得分:2)

比那简单..

if(varname){
      ...
}

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

答案 5 :(得分:1)

在测试变量是否存在时,您不应该使用该变量名称进行盲目测试。当找到深层嵌套对象的属性和方法时,相同的环是正确的。

考虑到这一点:

// 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
}

全局变量的另一个精细测试是使用内置的 typeof 方法,但如果你必须经常这样做,输入它会有点单调乏味。

// 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
}

答案 6 :(得分:1)

if (typeof somevar === "undefined") {
    // then the variable doesn't exist

答案 7 :(得分:0)

如果对象不存在,Javascript将在if语句中返回

var myObj = {};
if (myObj.someUnknown)
{
  // will not get here if someUnknown doesn't exist.
}

答案 8 :(得分:0)

function isVarDefined(str) {
    try { 
        return (typeof eval(str) !== 'undefined');
    }
    catch(e) {
        return false;
    }
}

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

isVarDefined('someObj.something.foo.bar')
PS:Eval是邪恶的。您应该清理str的值以仅包含变量名称而不是某些任意可执行代码。留给你作为锻炼!

答案 9 :(得分:0)

如果你需要做很多事情,一个函数版本来获取属性,如果它存在并返回undefined,否则是:

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'))

本质上是一个非投掷版本(假设你已声明someObj):

if (someObj.something.foo.bar)