Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Способ присваивания переменным дефолтных значений?
Просмотров: 353
 
Ответов: 10
Часто бывает так, что каким-либо переменным надо присвоить значение по-умолчанию, если не дано иного. Примерами могут быть необязательные аргументы функций, данные из localStorage и т. п. Есть разные способы, позволяющие это сделать, но сводятся они к одному смыслу:
проверить, присвоено ли какое-то значение / если да, то выполнять следующую задачу / если нет, то назначить дефолтное значение и выполнять следующую задачу.
Пара возможных примеров кода:
// 1-й вариант<br/>
if (!argument) argument = 'value';<br/>
<br/>
// 2-й вариант<br/>
argument = argument || 'value';
Вопрос в следующем — какой из приведенных вариантов является оптимальным? Какой из них лучше использовать?
// 1-й вариант<br/>
if (!argument) argument = 'value';<br/>
<br/>
// 2-й вариант<br/>
argument = argument || 'value';
Вы привели два равноценных варианта. Первый — наиболее универсальный. Второй — более языкоориентированный. Выбор — кому что нравится.
Один из вариантов (сам стараюсь так делать всегда) — начальная инициализация переменных. До выполнения всех действий описываете переменные и присваиваете им значения по умолчанию. Если соотвествующие параметры заданы — значения переменных обновляются.
Если же вы не присваиваете значения аргументов определенным переменным, а напрямую обращаетесь к этим аргументам, то второй вариант записи, на мой взгляд, более красивый. А первый — более читабельный для человека, слабо знакомого с дополнительными языковыми конструкциями типа 2го варианта. плюс второй вариант может генерировать более компактный код, но вряд ли на общем фоне такая экономия что даст :)
Варианты типа 2 лично я стараюсь использовать только если аргументы в выражении достаточно коротки. Слишком громоздкая конструкция неудобочитаема. Забудешь, потом сам будешь разбираться, что же хотел этим сказать :)
Оба варианта опасны, если их применять, не подумав. Во многих языках условие проверяет аргумент не только на «неопределённость», но и на равенство числу 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).
if(argument == undefined) argument = "value";function default(val, defval) {
return val == undefined?defval:val;
}
...
argument = default(argument, "value");
Оба способа нерабочие.
Предположим у функции есть фича, за которую отвечает последний, опциональный параметр, равный по умолчанию true.
Теперь внимание, пробуем её выключить:
//в функцию передано argument=false
// 1-й вариант
if (!argument) argument = 'true';
//agrument = true
// 2-й вариант
argument = argument || 'true';
//тоже самое, argument=true
Оба варианта неприемлемы. Т.к. используется неявное приведение типа переменной argument к булевскому значению. При приведении типа совершенно легальное по логике программы текущее значение может быть приведено к false, и оказаться замененным на дефолтное.
Надо проверять существование переменной и/или проверку на пустоту (null).
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться