How can I check whether a variable is defined in Node.js?

前端 未结 6 452
不知归路
不知归路 2021-01-31 01:18

I am working on a program in node.js which is actually js.

I have a variable :

var query = azure.TableQuery...

looks this line of the

相关标签:
6条回答
  • 2021-01-31 01:43

    If your variable is not declared nor defined:

    if ( typeof query !== 'undefined' ) { ... }
    

    If your variable is declared but undefined. (assuming the case here is that the variable might not be defined but it can be any other falsy value like false or "")

    if ( query ) { ... }
    

    If your variable is declared but can be undefined or null:

    if ( query != null ) { ... } // undefined == null
    
    0 讨论(0)
  • 2021-01-31 01:48
    if ( typeof query !== 'undefined' && query )
    {
      //do stuff if query is defined and not null
    }
    else
    {
    
    }
    
    0 讨论(0)
  • 2021-01-31 01:50

    For me, an expression like

    if (typeof query !== 'undefined' && query !== null){
       // do stuff
    }
    

    is more complicated than I want for how often I want to use it. That is, testing if a variable is defined/null is something I do frequently. I want such a test to be simple. To resolve this, I first tried to define the above code as a function, but node just gives me a syntax error, telling me the parameter to the function call is undefined. Not useful! So, searching about and working on this bit, I found a solution. Not for everyone perhaps. My solution involves using Sweet.js to define a macro. Here's how I did it:

    Here's the macro (filename: macro.sjs):

    // I had to install sweet using:
    // npm install --save-dev
    // See: https://www.npmjs.com/package/sweetbuild
    // Followed instructions from https://github.com/mozilla/sweet.js/wiki/node-loader
    
    // Initially I just had "($x)" in the macro below. But this failed to match with 
    // expressions such as "self.x. Adding the :expr qualifier cures things. See
    // http://jlongster.com/Writing-Your-First-Sweet.js-Macro
    
    macro isDefined {
      rule {
        ($x:expr)
      } => {
        (( typeof ($x) === 'undefined' || ($x) === null) ? false : true)
      }
    }
    
    
    // Seems the macros have to be exported
    // https://github.com/mozilla/sweet.js/wiki/modules
    
    export isDefined;
    

    Here's an example of usage of the macro (in example.sjs):

    function Foobar() {
        var self = this;
    
        self.x = 10;
    
        console.log(isDefined(y)); // false
        console.log(isDefined(self.x)); // true
    }
    
    module.exports = Foobar;
    

    And here's the main node file:

    var sweet = require('sweet.js');
    
    // load all exported macros in `macros.sjs`
    sweet.loadMacro('./macro.sjs');
    
    // example.sjs uses macros that have been defined and exported in `macros.sjs`
    var Foobar = require('./example.sjs');
    
    var x = new Foobar();
    

    A downside of this, aside from having to install Sweet, setup the macro, and load Sweet in your code, is that it can complicate error reporting in Node. It adds a second layer of parsing. Haven't worked with this much yet, so shall see how it goes first hand. I like Sweet though and I miss macros so will try to stick with it!

    0 讨论(0)
  • 2021-01-31 01:52

    Determine if property is existing (but is not a falsy value):

    if (typeof query !== 'undefined' && query !== null){
       doStuff();
    }
    

    Usually using

    if (query){
       doStuff();
    }
    

    is sufficient. Please note that:

    if (!query){
       doStuff();
    }
    

    doStuff() will execute even if query was an existing variable with falsy value (0, false, undefined or null)

    Btw, there's a sexy coffeescript way of doing this:

    if object?.property? then doStuff()
    

    which compiles to:

    if ((typeof object !== "undefined" && object !== null ? object.property : void 0) != null) 
    
    {
      doStuff();
    }
    
    0 讨论(0)
  • 2021-01-31 01:58

    It sounds like you're doing property checking on an object! If you want to check a property exists (but can be values such as null or 0 in addition to truthy values), the in operator can make for some nice syntax.

    var foo = { bar: 1234, baz: null };
    console.log("bar in foo:", "bar" in foo); // true
    console.log("baz in foo:", "baz" in foo); // true
    console.log("otherProp in foo:", "otherProp" in foo) // false
    console.log("__proto__ in foo:", "__proto__" in foo) // true
    

    As you can see, the __proto__ property is going to be thrown here. This is true for all inherited properties. For further reading, I'd recommend the MDN page:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

    0 讨论(0)
  • 2021-01-31 02:01

    For easy tasks I often simply do it like:

    var undef;
    
    // Fails on undefined variables
    if (query !== undef) {
        // variable is defined
    } else {
        // else do this
    }
    

    Or if you simply want to check for a nulled value too..

    var undef;
    
    // Fails on undefined variables
    // And even fails on null values
    if (query != undef) {
        // variable is defined and not null
    } else {
        // else do this
    }
    
    0 讨论(0)
提交回复
热议问题