Подтвердить что ты не робот

Как проверить, определена ли переменная (или), а не

Я работаю над программой в node.js, которая на самом деле js.

У меня есть переменная:

var query = azure.TableQuery...

выглядит, что эта строка кода не выполняется несколько раз.

мой вопрос:

Как я могу выполнить условие вроде:

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

Я не могу сделать в js (query!= null)

Я хочу посмотреть, не определена ли эта переменная. как это сделать

4b9b3361

Ответ 1

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

}

Ответ 2

Определите, существует ли свойство (но не является фальшивым значением):

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

Обычно используется

if (query){
   doStuff();
}

. Обратите внимание:

if (!query){
   doStuff();
}

doStuff() будет выполняться, даже если запрос был существующей переменной с фальшивым значением (0, false, undefined или null)

Кстати, есть сексуальный способ сделать это:

if object?.property? then doStuff()

который компилируется в:

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

{
  doStuff();
}

Ответ 3

Для меня выражение типа

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

сложнее, чем я хочу, как часто я хочу его использовать. То есть, тестирование, если переменная определена /null, является тем, что я часто делаю. Я хочу, чтобы такой тест был простым. Чтобы решить эту проблему, я сначала попытался определить вышеуказанный код как функцию, но node просто дает мне синтаксическую ошибку, указав, что параметр вызова функции undefined. Не полезно! Итак, ища и работая над этим битом, я нашел решение. Не для всех, может быть. Мое решение предполагает использование Sweet.js для определения макроса. Вот как я это сделал:

Здесь макрос (filename: 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;

И вот главный node файл:

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, хотя и я пропускаю макросы, поэтому постараюсь придерживаться его!

Ответ 4

Если ваша переменная не объявлена ​​и не определена:

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

Если ваша переменная объявлена, но undefined. (предполагая здесь, что переменная не может быть определена, но она может быть любым другим значением фальшивки, например false или "")

if ( query ) { ... }

Если ваша переменная объявлена, но может быть undefined или null:

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

Ответ 5

Похоже, вы делаете проверку свойств объекта! Если вы хотите проверить, что свойство существует (но могут быть значения, такие как 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