drfisher
@drfisher
Пишу JS

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

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

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


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

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



Вопрос в следующем — какой из приведенных вариантов является оптимальным? Какой из них лучше использовать?
  • Вопрос задан
  • 5389 просмотров
Решения вопроса 1
@SergeyGrigorev
Первый вариант является наиболее употребляемым и более понятным для чтения. Я бы порекомендовал придерживаться именно его.
Показал коллегам второй вариант… многие не сразу поняли его. Поэтому его лучше не использовать, если работаете в команде
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
Bonch
@Bonch
Лично мне более приятен второй вариант:

argument = argument || 'value';


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

argument ||= 'value';
Ответ написан
exIV
@exIV
имхо первый, ибо он более «нативен»
Ответ написан
bit
@bit
Вы привели два равноценных варианта. Первый — наиболее универсальный. Второй — более языкоориентированный. Выбор — кому что нравится.
Один из вариантов (сам стараюсь так делать всегда) — начальная инициализация переменных. До выполнения всех действий описываете переменные и присваиваете им значения по умолчанию. Если соотвествующие параметры заданы — значения переменных обновляются.
Если же вы не присваиваете значения аргументов определенным переменным, а напрямую обращаетесь к этим аргументам, то второй вариант записи, на мой взгляд, более красивый. А первый — более читабельный для человека, слабо знакомого с дополнительными языковыми конструкциями типа 2го варианта. плюс второй вариант может генерировать более компактный код, но вряд ли на общем фоне такая экономия что даст :)
Варианты типа 2 лично я стараюсь использовать только если аргументы в выражении достаточно коротки. Слишком громоздкая конструкция неудобочитаема. Забудешь, потом сам будешь разбираться, что же хотел этим сказать :)
Ответ написан
В Perl 5.10+, кстати, есть специальный оператор для этого: $arg // «value» — правая часть вычисляется не при булевой ложности, а при неопределённости (undef) левой части. Соответственно есть и такая конструкция: $arg //= «value»; — короткий и корректный способ решения проблемы.
Ответ написан
habrrich
@habrrich
Да не заморачивайтесь вы.
Используйте тот, который нравится в собственных скриптах и тот, который уже используется в чужих.
Ответ написан
@nutz
в копилку
!isset($ar) && $ar = 1;
Ответ написан
Оба варианта опасны, если их применять, не подумав. Во многих языках условие проверяет аргумент не только на «неопределённость», но и на равенство числу 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).
Ответ написан
vanxant
@vanxant
Оба способа нерабочие.
Предположим у функции есть фича, за которую отвечает последний, опциональный параметр, равный по умолчанию true.
Теперь внимание, пробуем её выключить:

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

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

// 2-й вариант
argument = argument || 'true';
//тоже самое, argument=true
Ответ написан
maximw
@maximw
Оба варианта неприемлемы. Т.к. используется неявное приведение типа переменной argument к булевскому значению. При приведении типа совершенно легальное по логике программы текущее значение может быть приведено к false, и оказаться замененным на дефолтное.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы