【问题标题】:How can I check whether a variable is defined in Node.js?如何检查 Node.js 中是否定义了变量?
【发布时间】:2012-11-11 21:56:33
【问题描述】:

我正在 node.js 中开发一个实际上是 js 的程序。

我有一个变量:

var query = azure.TableQuery...

看起来这行代码没有执行几次。

我的问题是:

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

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

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

我想看看这个变量是否被定义做一些事情。如何做到这一点

【问题讨论】:

  • if (query != undefined) { /* defined */ }
  • 为什么有时不定义? azure.TableQuery 是否真的返回 undefined
  • 您是在检查未定义,具体还是检查空、空数组、空对象、0...?
  • 看起来您正在尝试以同步方式执行一些异步操作 (TableQuery)。不要那样做,使用回调。我确信这个 azure 东西提供了这个功能。
  • @H2CO3 !=undefined 也会在 null 值上返回 true。他需要使用更严格的 !==

标签: javascript node.js


【解决方案1】:
if ( typeof query !== 'undefined' && query )
{
  //do stuff if query is defined and not null
}
else
{

}

【讨论】:

  • 你能告诉我你为什么改变和添加 typeof 和 &&
  • "not null" 应该是“not null, zero, false 或任何其他评估为假的东西”
  • 因为js中的变量可以为null也可以为undefined。这些是不同的状态。所以我们必须检查两种情况
  • 要同时测试两者,您可以使用query == null。这将测试nullundefined,但不会测试其他虚假值。或者只是做query === undefined 来单独测试那个值。
  • @KirillIvlev:未声明未定义的变量是有区别的。如果变量是未声明的,你应该声明它。如果您遇到错误,那么这会提醒您您做错了什么。
【解决方案2】:

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

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

通常使用

if (query){
   doStuff();
}

就足够了。请注意:

if (!query){
   doStuff();
}

doStuff() 将执行,即使查询是具有虚假值(0、false、未定义或 null)的现有变量

顺便说一句,有一种性感的咖啡脚本可以做到这一点:

if object?.property? then doStuff()

编译为:

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

{
  doStuff();
}

【讨论】:

  • 虽然if (query){ doStuff(); }if (query){ doStuff(); }在整数0查询时不起作用
【解决方案3】:

对我来说,这样的表达方式

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

对于我想要使用它的频率来说,它比我想要的要复杂。也就是说,测试变量是否定义/为空是我经常做的事情。我希望这样的测试很简单。为了解决这个问题,我首先尝试将上面的代码定义为一个函数,但是 node 只是给了我一个语法错误,告诉我函数调用的参数是未定义的。没用处!所以,搜索并研究这一点,我找到了一个解决方案。也许不适合所有人。我的解决方案涉及使用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;

以下是宏的使用示例(在 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、设置宏和在代码中加载 Sweet 之外,这样做的一个缺点是它会使 Node.js 中的错误报告变得复杂。它增加了第二层解析。还没有使用这么多,所以将亲眼目睹它是如何进行的。不过我喜欢 Sweet,我想念宏,所以会尽量坚持下去!

【讨论】:

    【解决方案4】:

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

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

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

    if ( query ) { ... }
    

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

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

    【讨论】:

      【解决方案5】:

      对于简单的任务,我通常会这样做:

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

      或者,如果您也只是想检查空值..

      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
      }
      

      【讨论】:

        【解决方案6】:

        听起来您正在对一个对象进行属性检查!如果您想检查某个属性是否存在(但除了真值之外还可以是 null 或 0 等值),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__ 属性将被抛出此处。这适用于所有继承的属性。为了进一步阅读,我推荐 MDN 页面:

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

        【讨论】:

          【解决方案7】:

          您可以使用双感叹号!! 来检查某些内容是否已定义且不为空。

          【讨论】:

          猜你喜欢
          • 2010-09-22
          • 2017-01-09
          • 2021-04-21
          • 2015-05-01
          • 1970-01-01
          • 2012-01-20
          • 2012-10-07
          • 2015-07-14
          • 2021-10-03
          相关资源
          最近更新 更多