Заменить значение, если значение null или undefined в JavaScript

У меня есть требование применить оператор ?? С# к JavaScript, и я не знаю, как это сделать. Рассмотрим это в С#:

int i?=null;
int j=i ?? 10;//j is now 10

Теперь у меня это настроено в JavaScript:

var options={
       filters:{
          firstName:'abc'
       } 
    };
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter

Как мне это сделать правильно?

Спасибо.

EDIT: я обнаружил половину проблемы: я не могу использовать нотацию 'indexer' для объектов (my_object[0]). Есть ли способ обойти его? (Я заранее не знаю имена свойств фильтров и не хочу их перебирать).

Ответ 1

Вот эквивалент JavaScript:

var i = null;
var j = i || 10; //j is now 10

Обратите внимание, что логический оператор || не возвращает логическое значение, а первое значение, которое может быть преобразовано в true.

Дополнительно используйте массив объектов вместо одного объекта:

var options = {
    filters: [
        {
            name: 'firstName',
            value: 'abc'
        }
    ]
};
var filter  = options.filters[0] || '';  // is {name:'firstName', value:'abc'}
var filter2 = options.filters[1] || '';  // is ''

К этому можно обратиться по индексу.

Ответ 2

Я заметил половину проблемы: я не могу использовать нотацию 'indexer' для объектов (my_object [0]). Есть ли способ обойти его?

Нет; объектный литерал, как следует из названия, является объектом, а не массивом, поэтому вы не можете просто получить свойство на основе индекса, так как нет определенного порядка их свойств. Единственный способ получить их значения - использовать определенное имя:

var someVar = options.filters.firstName; //Returns 'abc'

Или путем итерации по ним с помощью цикла for ... in:

for(var p in options.filters) {
    var someVar = options.filters[p]; //Returns the property being iterated
}