JavaScript установить переменную, если она не определена - PullRequest
154 голосов
/ 23 марта 2011

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

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

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

Ответы [ 8 ]

288 голосов
/ 23 марта 2011

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

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

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

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

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

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

22 голосов
/ 27 сентября 2017

Ответ ES6 2018 года: :

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

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

6 голосов
/ 30 июня 2016

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

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

В этом случае, если getVariable не является числом (строка, объект и т. Д.), SetVariable устанавливается в0

5 голосов
/ 16 января 2017

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

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

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

hasPoints = setDefaultVal(this.hasPoints, true);
1 голос
/ 23 марта 2011

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

0 голосов
/ 12 января 2019

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

var setVariable = ( (b = 0) => b )( localStorage.getItem('value') );
0 голосов
/ 17 декабря 2018

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

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

const result = defaultTo(30)(value)

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

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

0 голосов
/ 30 октября 2014

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

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;
    }
}

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

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