如何检查一个variables是否被定义(或)

我正在研究node.js中的一个程序,它实际上是js。

我有一个variables:

var query = azure.TableQuery... 

看起来这行代码不执行一些时间。

我的问题是:

我怎样才能做到这样的条件:

 if this variable is defined do this. else do this. 

我不能在js (query!= null)

我想看看这个variables是否定义做一些事情。 这个怎么做

 if ( typeof query !== 'undefined' && query ) { //do stuff if query is defined and not null } else { } 

确定财产是否存在(但不是一个虚假价值):

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

通常使用

 if (query){ doStuff(); } 

足够了。 请注意:

 if (!query){ doStuff(); } 

即使查询是一个具有伪造值(0,false,undefined或null)的现有variables,doStuff()也会执行。

顺便说一句,有一个性感的咖啡标记的方式做到这一点:

 if object?.property? then doStuff() 

编译为:

 if ((typeof object !== "undefined" && object !== null ? object.property : void 0) != null) { doStuff(); } 

对我来说,像

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

比我想要使用它的频率更复杂。 也就是说,testing一个variables是否定义/ null是我经常做的事情。 我希望这样的testing很简单。 为了解决这个问题,我首先尝试将上面的代码定义为一个函数,但节点只是给了我一个语法错误,告诉我函数调用的参数是未定义的。 没有用! 所以,寻找并研究这一点,我find了一个解决scheme。 也许不适合每个人。 我的解决scheme涉及到使用Sweet.js来定义一个macros。 以下是我如何做到的:

这里是macros(文件名: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; 

下面是一个使用macros的例子(在example.sjs中):

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

这里是主节点文件:

 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(); 

这样做的缺点是,除了安装Sweet之外,还需要设置macros,并在代码中加载Sweet,这可能会使Node中的错误报告复杂化。 它增加了第二层parsing。 还没有这么多的工作,所以应该看看它是如何第一手的。 我喜欢甜,但我想念macros,所以会试图坚持下去!

如果你的variables没有声明,也没有定义:

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

如果你的variables被声明,但未定义。 (假设这里的情况是这个variables可能没有被定义,但它可以是任何其他的虚假值,如false""

 if ( query ) { ... } 

如果你的variables被声明了,但是可以是undefined或者是null

 if ( query != null ) { ... } // undefined == null 

这听起来像你正在做一个对象的属性检查! 如果你想检查一个属性是否存在(但是除了真值之外可以是空值或零值),那么in运算符可以使用一些很好的语法。

 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 

正如你所看到的, __proto__属性将在这里被抛出。 所有inheritance的属性都是如此。 为了进一步阅读,我build议MDN页面:

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