检查javascript中是否存在变量

时间:2013-05-23 16:31:01

标签: javascript

我知道在javascript中有两种方法可以确定变量是否存在而不是null(false,empty):

1)if ( typeof variableName !== 'undefined' && variableName )

2)if ( window.variableName )

哪一个更受欢迎?为什么?

8 个答案:

答案 0 :(得分:98)

如果访问变量名称不会产生ReferenceError,则变量声明。只有两种情况中的一种情况,typeof variableName !== 'undefined'表达式为false

  • 未声明变量(即范围内没有var variableName),
  • 声明变量并且其值为undefined(即变量的 未定义

否则,比较评估为true

如果你真的想测试一个变量是否被声明,你需要catch试图引用它所产生的任何ReferenceError

var barIsDeclared = true; 
try{ bar; }
catch(e) {
    if(e.name == "ReferenceError") {
        barIsDeclared = false;
    }
}

如果您只是想测试声明变量的值是否既不是undefined也不是null,那么您只需测试它:

if (variableName !== undefined && variableName !== null) { ... }

或等效地,对null进行非严格的相等检查:

if (variableName != null) { ... }

&&操作中的第二个示例和右手表达式都测试值是否为“falsey”,即它是否在布尔上下文中强制为false。这些值包括nullfalse0和空字符串,并非您可能要丢弃的所有字符串。

答案 1 :(得分:19)

重要的是要注意'undefined'是要保持的变量的完全有效值。如果要检查变量是否存在,

if (window.variableName)

是一个更完整的检查,因为它正在验证变量是否已实际定义。但是,这仅在保证变量是对象时才有用!另外,正如其他人所指出的,如果variableName的值为false,0,''或null,则也可能返回false。

尽管如此,这对我们的日常用途来说通常是不够的,因为我们通常不希望有不确定的价值。因此,您应首先检查变量是否已定义,然后使用typeof运算符断言它未定义,正如Adam指出的那样,除非变量确实未定义,否则不会返回undefined。

if ( variableName  && typeof variableName !== 'undefined' )

答案 2 :(得分:9)

如果要检查变量(比如说v)是否已定义且不为null:

if (typeof v !== 'undefined' && v !== null) {
    // Do some operation  
}

如果您想检查所有虚假值,例如:undefinednull''0false

if (v) {
   // Do some operation
}

答案 3 :(得分:6)

我之所以写答案只是因为我没有足够的声誉来评论来自 apsillers 的接受答案。 我同意他的回答,但

  

如果你真的想测试一个变量是否未声明,你需要   捕获ReferenceError ...

不是唯一的方法。人们可以做到:

    public class MyObject
    {
        [BsonIgnoreIfDefault]
        public string _id { get; set; }
        public int X { get; set; }
    }

    static void Main(string[] args)
    {
        var Client      = new MongoClient("mongodb://localhost");
        var Database    = Client.GetDatabase("testdatabase");
        var Driver      = Database.GetCollection<MyObject>("testcollection");
        Driver.Indexes.CreateOne(Builders<MyObject>.IndexKeys.Ascending(_ => _._id));

        var C1 = Driver.Count(_ => true);
        // c1 == 0 since the db is empty

        var A1 = Driver.UpdateMany(_ => false, Builders<MyObject>.Update.Set(_ => _.X, 1), new UpdateOptions {IsUpsert = true});
        //A1.MatchedCount == 0
        //A1.ModifiedCount == 0;
        //A1.Upsertdld = (some id)

        var C2 = Driver.Count(_ => true);
        // c2 == 1 because a dummy document was created due to the upsert flag

        var A2 = Driver.UpdateMany(_ => true, Builders<MyObject>.Update.Set(_ => _.X, 3), new UpdateOptions {IsUpsert = true});
        //A2.MatchedCount == 1
        //A2.ModifiedCount == 1;
        //A2.Upsertdld = null;

        var C3 = Driver.Count(_ => true);
        // c3 == 1 since no new dummy documents were created as there was a match

    }

检查当前上下文中是否声明了变量 bar 。 (我不确定,但是调用 hasOwnProperty 也可能比提出异常更快/更有效) 这仅适用于当前上下文(不适用于整个当前范围)。

答案 4 :(得分:2)

if ( typeof variableName !== 'undefined' && variableName )
//// could throw an error if var doesnt exist at all

if ( window.variableName )
//// could be true if var == 0

////further on it depends on what is stored into that var
// if you expect an object to be stored in that var maybe
if ( !!window.variableName )
//could be the right way

best way => see what works for your case

答案 5 :(得分:1)

我发现这个更短更好:

    if(varName !== (undefined || null)) { //do something }

答案 6 :(得分:0)

如果保证变量是对象,则可以使用

if (variable),或者如果将false,0等视为“默认”值(因此等效于undefined或null)。

typeof variable == 'undefined'可用于指定的null对未初始化的变量或属性具有不同含义的情况。此检查不会抛出,并且未声明错误是变量。

答案 7 :(得分:-1)

你可以简单地做 SED PROGRAM: /\n/ { P D } s/[0-9]{3}_[0-9]{3}/ & / D INPUT: 'file' line 1 PATTERN: aaa123_456bbb123_456ccc COMMAND: /\n/ { COMMAND: } COMMAND: s/[0-9]{3}_[0-9]{3}/ & / MATCHED REGEX REGISTERS regex[0] = 3-10 '123_456' PATTERN: aaa\n123_456\nbbb123_456ccc MATCHED REGEX REGISTERS regex[0] = 0-3 'aaa' PATTERN: \n123_456\nbbb123_456ccc COMMAND: D PATTERN: 123_456\nbbb123_456ccc COMMAND: /\n/ { COMMAND: P 123_456 COMMAND: D PATTERN: bbb123_456ccc COMMAND: /\n/ { COMMAND: } COMMAND: s/[0-9]{3}_[0-9]{3}/ & / MATCHED REGEX REGISTERS regex[0] = 3-10 '123_456' PATTERN: bbb\n123_456\nccc MATCHED REGEX REGISTERS regex[0] = 0-3 'bbb' PATTERN: \n123_456\nccc COMMAND: D PATTERN: 123_456\nccc COMMAND: /\n/ { COMMAND: P 123_456 COMMAND: D PATTERN: ccc COMMAND: /\n/ { COMMAND: } COMMAND: s/[0-9]{3}_[0-9]{3}/ & / PATTERN: ccc MATCHED REGEX REGISTERS regex[0] = 0-3 'ccc' PATTERN: COMMAND: D