我正在开发实际上是js的node.js中的程序。
我有一个变量:
var query = azure.TableQuery...
看起来这行代码没有执行过一段时间。
我的问题是:
我该如何做类似的情况:
if this variable is defined do this.
else do this.
我不能用js做 (query!= null)
我想看看是否已定义此变量,请执行某些操作。这该怎么做
我正在开发实际上是js的node.js中的程序。
我有一个变量:
var query = azure.TableQuery...
看起来这行代码没有执行过一段时间。
我的问题是:
我该如何做类似的情况:
if this variable is defined do this.
else do this.
我不能用js做 (query!= null)
我想看看是否已定义此变量,请执行某些操作。这该怎么做
azure.TableQuery真正回归undefined?
TableQuery同步方式执行一些异步操作()。不要这样做,请使用回调。我确定这azure件事提供了此功能。
Answers:
if ( typeof query !== 'undefined' && query )
{
//do stuff if query is defined and not null
}
else
{
}
query == null。那会测试null或undefined,但不会其他虚假值。或者只是query === undefined单独测试该值。
确定属性是否存在(但不是伪造的值):
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();
}
if (query){ doStuff(); }
对我来说,像
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,但我想念宏,所以会尽量坚持下去!
对于简单的任务,我通常只是这样做:
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
}
听起来您正在对对象进行属性检查!如果要检查属性是否存在(除了真实值,还可以是诸如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
if (query != undefined) { /* defined */ }