Javascript устанавливает переменную, если undefined

Я знаю, что я могу проверить переменную javascript, а затем определить ее, если она undefined, но не существует какой-то способ сказать

var setVariable = localStorage.getItem('value') || 0;

кажется гораздо более понятным, и я уверен, что видел это на других языках.

Ответ 1

Да, он может это сделать, но, строго говоря, это назначит значение по умолчанию, если искомое значение ложно, а не действительно undefined. Следовательно, это не только соответствует undefined, но также null, false, 0, NaN, "" (но не "0").

Если вы хотите установить значение по умолчанию, только если переменная строго undefined, то самым безопасным способом является запись:

var x = (typeof x === 'undefined') ? def_val : x;

В новых браузерах действительно безопасно писать:

var x = (x === undefined) ? def_val : x;

но имейте в виду, что можно обойти это на более старых браузерах, где разрешено объявлять переменную с именем undefined, которая имеет определенное значение, в результате чего тест завершился с ошибкой.

Ответ 2

Ответ 2016 ES6:

return Object.is(x, undefined) ? y : x;

Если переменная x не определена, вернуть переменную y... в противном случае, если переменная x определена, вернуть переменную x.

Ответ 3

Кажется более логичным проверить typeof вместо undefined? Я предполагаю, что вы ожидаете число, когда вы устанавливаете var в 0, когда undefined:

var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;

В этом случае, если getVariable не является числом (string, object, whatever), setVariable имеет значение 0

Ответ 4

Мне нужно было "установить переменную, если undefined" в нескольких местах. Я создал функцию с использованием ответа @Alnitak. Надеюсь, это поможет кому-то.

function setDefaultVal(value, defaultValue){
   return (value === undefined) ? defaultValue : value;
}  

Использование:

hasPoints = setDefaultVal(this.hasPoints, true);

Ответ 5

var setVariable = (typeof localStorage.getItem('value') !== 'undefined' && localStorage.getItem('value')) || 0;

Ответ 6

В этот же сценарий и сегодня, где я не хочу, чтобы нуль был перезаписан для нескольких значений. У нас есть файл с некоторыми распространенными методами утилиты для таких сценариев. Здесь я добавил, чтобы обработать сценарий и быть гибким.

function getIfNotSet(value, newValue, overwriteNull, overwriteZero) {
    if (typeof (value) === 'undefined') {
        return newValue;
    } else if (value === null && overwriteNull === true) {
        return newValue;
    } else if (value === 0 && overwriteZero === true) {
        return newValue;
    } else {
        return value;
    }
}

Затем он может быть вызван с последними двумя параметрами, которые являются необязательными, если я хочу только установить для значений undefined или также перезаписать нулевые или 0 значения. Здесь приведен пример вызова, который установит идентификатор в -1, если идентификатор undefined или null, но не будет перезаписывать значение 0.

data.ID = Util.getIfNotSet(data.ID, -1, true);

Ответ 7

Если вы поклонник FP, у Ramda есть полезная вспомогательная функция для этого по умолчанию defaultTo:

использование:

const result = defaultTo(30)(value)

Это более полезно при работе с undefined логическими значениями:

const result2 = defaultTo(false)(dashboard.someValue)

Ответ 8

Работает, даже если значением по умолчанию является логическое значение:

var setVariable = ( (b = 0) => b )( localStorage.getItem('value') );