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


74

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

我有一个变量:

var query = azure.TableQuery...

看起来这行代码没有执行过一段时间。

我的问题是:

我该如何做类似的情况:

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

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

我想看看是否已定义此变量,请执行某些操作。这该怎么做


5
if (query != undefined) { /* defined */ }

1
为什么有时不定义它?是否azure.TableQuery真正回归undefined
我讨厌懒惰的2012年

1
具体来说,您要检查未定义的内容,还是要检查null,空数组,空对象,0 ...?
马修·布兰卡特

看来您正在尝试以TableQuery同步方式执行一些异步操作()。不要这样做,请使用回调。我确定这azure件事提供了此功能。
奇特

@ H2CO3!= undefined也会在返回空值时返回true。他需要用更严格的==!
三月Örlygsson

Answers:


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

}

您能告诉我为什么更改和添加了typeof和&&吗?
学习者

4
“非null”应为“非null,零,false或其他任何评估为false的值”
Quentin 2012年

因为js中的变量可以为null或未定义。那些是不同的状态。因此,我们必须检查这两种情况
Kirill Ivlev 2012年

3
要同时测试两者,您可以执行query == null。那会测试nullundefined,但不会其他虚假值。或者只是query === undefined单独测试该值。
我讨厌懒惰的2012年

1
@KirillIvlev:变量未声明未定义之间有区别。如果未声明变量,则应声明它。如果遇到错误,则可以提醒您做错了什么。
我讨厌懒惰的

30

确定属性是否存在(但不是伪造的值):

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

通常使用

if (query){
   doStuff();
}

足够了。请注意:

if (!query){
   doStuff();
}

即使查询是具有假值(0,false,undefined或null)的现有变量,doStuff()也会执行

顺便说一句,有一种性感的coffeescript方法可以做到这一点:

if object?.property? then doStuff()

编译为:

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

{
  doStuff();
}

这在整数0查询的情况下不起作用if (query){ doStuff(); }
fiorentinoing

22

对我来说,像

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中的错误报告变得复杂。它添加了第二层解析。还没有进行太多的工作,因此请直接了解如何进行。我虽然喜欢Sweet,但我想念宏,所以会尽量坚持下去!


6

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

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

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

if ( query ) { ... }

如果声明了变量,但可以是undefinednull

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

3

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

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
}

1

听起来您正在对对象进行属性检查!如果要检查属性是否存在(除了真实值,还可以是诸如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/zh-CN/docs/Web/JavaScript/Reference/Operators/in

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.