Каков краткий и надежный способ написания этих инструкций на JavaScript?

StackOverflow https://stackoverflow.com/questions/1720032

Вопрос

У меня есть <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() на самом деле делает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top