Каков краткий и надежный способ написания этих инструкций на JavaScript?
-
19-09-2019 - |
Вопрос
У меня есть <iframe> , который использует некоторые переменные, которые заданы в объектном литерале в родительском документе.Эти переменные являются необязательными;если они установлены, я хочу использовать их значения, присвоив их более сжатой глобальной переменной;если нет, я хочу вызвать функцию error().
Прежде всего, является ли этот оператор троичного оператора действительным и эффективным для того, что я хочу сделать?Есть ли здесь какие-нибудь потенциальные ловушки?
parent.settings.account ? var account = parent.settings.account : error();
Во-вторых, есть ли более краткий способ написать это утверждение?
Некоторые из этих переменных являются необязательными, но если они определены, то имеют диапазон допустимых значений.Каков надежный способ справиться с этим?Что-то вроде этого?
if (parent.settings.polling_interval && parent.settings.polling_interval >= 1000 && parent.settings.polling_interval <= 5000) {
var polling_interval = parent.settings.polling_interval;
} else {
var polling_interval = 3000; // default
}
В принципе, если оно не определено или находится вне диапазона, я хочу использовать значение по умолчанию.
Могу ли я полагаться только на условное утверждение типа:
if (parent.settings.polling_interval) { ... }
или мне нужно проверить, не определено ли оно, вот так?
if (typeof parent.settings.polling_interval !== 'undefined') { ... }
Есть ли что-то более надежное и / или лаконичное?Спасибо за любой совет.
Решение
Это неправильно:
parent.settings.account ? var account = parent.settings.account : error();
Ты хотел сказать:
var account = parent.settings.account ? parent.settings.account : error();
Или даже:
var account = parent.settings.account || error();
Другие советы
var account = parent.settings.account;
if (!account)
error();
if ((p = parent.settings.polling_interval) && p >= 1000 && p <= 5000) {
...
}
var polling_interval = (p = parent.settings.polling_interval) && p >= 1000 && p <= 5000 ? p : 3000;
[1]
parent.settings.account ? ( var account = parent.settings.account ) : error();
Это вызовет ошибку SyntaxError, поскольку вы не можете определить переменную таким образом.
Если error()
вызывает исключение / выдает ошибку, после чего вы можете сделать:
if ( !parent.settings.account ) {
error()
}
// continue code
Как указывалось ранее, вы также можете присвоить переменную свойству:
var account = parent.settings.account || error();
[2]
var pollingInterval = parent.settings.polling_interval &&
parent.settings.polling_interval >= 1000 &&
parent.settings.polling_interval <= 5000 ?
parent.settings.polling_interval : 3000;
[3] Вы можете использовать if ( parent.foo )
и если foo
is undefined строгая ошибка не будет выдана, но она будет просто равна undefined, предполагая, что parent всегда определен.
Если settings определены, а polling_interval - нет, то тот же случай.Если вы уверены, что свойство установлено и объект настроек будет существовать, то вы можете использовать
if ( parent.settings.polling_interval ) { }
Это помогло бы указать, что error()
на самом деле делает.