Сведения о вопросе

HEIGTH

08:24, 23rd August, 2020

Теги

JavaScript    

Способ присваивания переменным дефолтных значений?

Просмотров: 353   Ответов: 10

Часто бывает так, что каким-либо переменным надо присвоить значение по-умолчанию, если не дано иного. Примерами могут быть необязательные аргументы функций, данные из localStorage и т. п. Есть разные способы, позволяющие это сделать, но сводятся они к одному смыслу:

проверить, присвоено ли какое-то значение / если да, то выполнять следующую задачу / если нет, то назначить дефолтное значение и выполнять следующую задачу.


Пара возможных примеров кода:

// 1-й вариант<br/>
if (!argument) argument = 'value';<br/>
<br/>
// 2-й вариант<br/>
argument = argument || 'value';



Вопрос в следующем — какой из приведенных вариантов является оптимальным? Какой из них лучше использовать?



  Сведения об ответе

pumpa

12:55, 18th August, 2020

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


  Сведения об ответе

SEEYOU

19:59, 6th August, 2020

Лично мне более приятен второй вариант:

argument = argument || 'value';


Жалко, что в JS нельзя сделать так (как в Ruby):

argument ||= 'value';


  Сведения об ответе

DO__IT

05:56, 7th August, 2020

имхо первый, ибо он более «нативен»


  Сведения об ответе

SILA

17:37, 27th August, 2020

Вы привели два равноценных варианта. Первый — наиболее универсальный. Второй — более языкоориентированный. Выбор — кому что нравится.
Один из вариантов (сам стараюсь так делать всегда) — начальная инициализация переменных. До выполнения всех действий описываете переменные и присваиваете им значения по умолчанию. Если соотвествующие параметры заданы — значения переменных обновляются.
Если же вы не присваиваете значения аргументов определенным переменным, а напрямую обращаетесь к этим аргументам, то второй вариант записи, на мой взгляд, более красивый. А первый — более читабельный для человека, слабо знакомого с дополнительными языковыми конструкциями типа 2го варианта. плюс второй вариант может генерировать более компактный код, но вряд ли на общем фоне такая экономия что даст :)
Варианты типа 2 лично я стараюсь использовать только если аргументы в выражении достаточно коротки. Слишком громоздкая конструкция неудобочитаема. Забудешь, потом сам будешь разбираться, что же хотел этим сказать :)


  Сведения об ответе

P_S_S

03:09, 25th August, 2020

В Perl 5.10+, кстати, есть специальный оператор для этого: $arg // «value» — правая часть вычисляется не при булевой ложности, а при неопределённости (undef) левой части. Соответственно есть и такая конструкция: $arg //= «value»; — короткий и корректный способ решения проблемы.


  Сведения об ответе

padenie

13:57, 27th August, 2020

Да не заморачивайтесь вы.
Используйте тот, который нравится в собственных скриптах и тот, который уже используется в чужих.


  Сведения об ответе

PAGE

19:15, 16th August, 2020

в копилку
!isset($ar) && $ar = 1;


  Сведения об ответе

ASER

21:22, 11th August, 2020

Оба варианта опасны, если их применять, не подумав. Во многих языках условие проверяет аргумент не только на «неопределённость», но и на равенство числу 0, пустой строке или даже строке «0». Я бы писал медленно, но верно:
if(argument == undefined) argument = "value";

Иногда подобную конструкцию оборачивают в простенькую функцию:
function default(val, defval) {
  return val == undefined?defval:val;
}
...
argument = default(argument, "value");
Такая функция, к примеру, встроена в скриптовый язык AviSynth. В Java у класса Properties (надстройка над хэш-таблицей) есть метод getProperty(key, defValue) (вернёт defValue, если в таблице отсутствует запись с ключом key).


  Сведения об ответе

screen

21:06, 1st October, 2020

Оба способа нерабочие.
Предположим у функции есть фича, за которую отвечает последний, опциональный параметр, равный по умолчанию true.
Теперь внимание, пробуем её выключить:

//в функцию передано argument=false

// 1-й вариант
if (!argument) argument = 'true';
//agrument = true

// 2-й вариант
argument = argument || 'true';
//тоже самое, argument=true


  Сведения об ответе

KOMP

18:15, 13th August, 2020

Оба варианта неприемлемы. Т.к. используется неявное приведение типа переменной argument к булевскому значению. При приведении типа совершенно легальное по логике программы текущее значение может быть приведено к false, и оказаться замененным на дефолтное.

Надо проверять существование переменной и/или проверку на пустоту (null).


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться