80

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

我有一个变量:

var query = azure.TableQuery...

看起来这行代码有时没有执行。

我的问题是:

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

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

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

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

4

7 回答 7

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

}
于 2012-11-11T21:58:07.733 回答
34

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

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

通常使用

if (query){
   doStuff();
}

足够了。请注意:

if (!query){
   doStuff();
}

即使查询是具有假值(0、假、未定义或空)的现有变量,doStuff() 也会执行

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

if object?.property? then doStuff()

编译为:

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

{
  doStuff();
}
于 2012-11-11T22:14:58.657 回答
25

对我来说,像这样的表达

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 并且我想念宏,所以会尽量坚持下去!

于 2015-12-05T08:28:05.160 回答
7

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

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

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

if ( query ) { ... }

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

if ( query != null ) { ... } // undefined == null
于 2012-11-11T22:05:32.457 回答
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
}
于 2018-01-10T19:43:17.767 回答
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/en-US/docs/Web/JavaScript/Reference/Operators/in

于 2015-08-02T17:30:31.117 回答
0

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

在此处输入图像描述

于 2021-12-21T14:44:44.500 回答