如何检查Node.js中是否定义了变量?

The*_*ner 61 javascript node.js

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

我有一个变量:

var query = azure.TableQuery...
Run Code Online (Sandbox Code Playgroud)

看起来这行代码没有执行一些时间.

我的问题是:

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

if this variable is defined do this.
else do this.
Run Code Online (Sandbox Code Playgroud)

我不能在js做 (query!= null)

我想看看这个变量是否被定义做了一些事情.这该怎么做

Kir*_*lev 87

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

}
Run Code Online (Sandbox Code Playgroud)

  • "not null"应该是"not null,zero,false或其他任何评估为false的" (4认同)
  • 要测试它们,你可以做`query == null`.那将测试`null`或`undefined`,但没有其他虚假值.或者只是执行`query === undefined`来单独测试该值. (3认同)

Raf*_*zak 22

确定属性是否存在(但不是虚假值):

if (typeof query !== 'undefined' && query !== null){
   doStuff();
}
Run Code Online (Sandbox Code Playgroud)

通常使用

if (query){
   doStuff();
}
Run Code Online (Sandbox Code Playgroud)

足够了.请注意:

if (!query){
   doStuff();
}
Run Code Online (Sandbox Code Playgroud)

doStuff()将执行即使查询是用falsy值现有变量(0,假,undefined或null)

顺便说一下,有一种性感的咖啡方式:

if object?.property? then doStuff()
Run Code Online (Sandbox Code Playgroud)

编译为:

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

{
  doStuff();
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*nce 11

对我来说,像一个表达

if (typeof query !== 'undefined' && query !== null){
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我想要使​​用它的频率比我想要的要复杂得多.也就是说,测试变量是否定义为/ null是我经常做的事情.我希望这样的测试很简单.为了解决这个问题,我首先尝试将上面的代码定义为函数,但是节点只给我一个语法错误,告诉我函数调用的参数是未定义的.没有用!因此,搜索并研究这一点,我找到了一个解决方案.不是每个人都有.我的解决方案涉及使用Sweet.js来定义宏.我是这样做的:

这是宏(文件名: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;
Run Code Online (Sandbox Code Playgroud)

以下是宏的使用示例(在example.sjs中):

function Foobar() {
    var self = this;

    self.x = 10;

    console.log(isDefined(y)); // false
    console.log(isDefined(self.x)); // true
}

module.exports = Foobar;
Run Code Online (Sandbox Code Playgroud)

这是主节点文件:

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();
Run Code Online (Sandbox Code Playgroud)

除此之外,除了必须安装Sweet之外,设置宏,并在代码中加载Sweet,它可能会使Node中的错误报告复杂化.它增加了第二层解析.还没有用过这么多,所以应该看看它是如何成为第一手的.我喜欢Sweet虽然我想念宏,所以会尽力坚持下去!


elc*_*nrs 6

如果您的变量未声明也未定义:

if ( typeof query !== 'undefined' ) { ... }
Run Code Online (Sandbox Code Playgroud)

如果您的变量已声明但未定义.(假设这里的情况是变量可能没有被定义,但它可以是任何其他的虚假值,如false"")

if ( query ) { ... }
Run Code Online (Sandbox Code Playgroud)

如果您的变量已声明但可以是undefinednull:

if ( query != null ) { ... } // undefined == null
Run Code Online (Sandbox Code Playgroud)