Ответ 1
if ( typeof query !== 'undefined' && query )
{
//do stuff if query is defined and not null
}
else
{
}
Я работаю над программой в node.js, которая на самом деле js.
У меня есть переменная:
var query = azure.TableQuery...
выглядит, что эта строка кода не выполняется несколько раз.
мой вопрос:
Как я могу выполнить условие вроде:
if this variable is defined do this.
else do this.
Я не могу сделать в js (query!= null)
Я хочу посмотреть, не определена ли эта переменная. как это сделать
if ( typeof query !== 'undefined' && query )
{
//do stuff if query is defined and not null
}
else
{
}
Определите, существует ли свойство (но не является фальшивым значением):
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();
}
Для меня выражение типа
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, хотя и я пропускаю макросы, поэтому постараюсь придерживаться его!
Если ваша переменная не объявлена и не определена:
if ( typeof query !== 'undefined' ) { ... }
Если ваша переменная объявлена, но undefined. (предполагая здесь, что переменная не может быть определена, но она может быть любым другим значением фальшивки, например false
или ""
)
if ( query ) { ... }
Если ваша переменная объявлена, но может быть undefined
или null
:
if ( query != null ) { ... } // undefined == null
Похоже, вы делаете проверку свойств объекта! Если вы хотите проверить, что свойство существует (но могут быть значения, такие как 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