Способ проверить кучу параметров, если они установлены или нет в JavaScript - PullRequest
1 голос
/ 02 декабря 2010

Итак, это случается со мной довольно часто, но вот мой последний:

  var generic_error = function(title,msg){
        if(!title){ title= 'Oops!'; }
        if(!msg) { msg = 'Something must have gone wrong, but no worries we\'re working on it!'; }
        $.fancybox(
        {
            content:'\
                <div class="error_alert">\
                    <h2>'+title+'</h2>\
                    <p>'+msg+'\
                </div>'
        });
    }

Есть ли более чистый способ проверить все параметры, такие как title и msg выше, и ИЛИ установить их как необязательные ИЛИ определить значения по умолчанию в функции, например, как это делает PHP, например? Иногда у меня может быть 10 вариантов, и if(!var){var='defaults'} x 10 - это неприглядно ...

Ответы [ 6 ]

4 голосов
/ 02 декабря 2010

Немного короче, но эквивалентно тому, что вы делаете сейчас, это используйте "||"АКА "или" АКА "оператор по умолчанию".

title = title || 'Oops!';
 msg = msg || 'Something must have gone wrong, but no worries we\'re working on it!';
1 голос
/ 02 декабря 2010
switch (arguments.length) {
  case 0: title = 'Oops';
  case 1: message = 'Something must have gone wrong...';
}
1 голос
/ 02 декабря 2010

Вы можете использовать троичную запись как , рекомендованную в этой статье , но в более простой форме:

var n = null;
!title ? title = 'Oops' : n;

Вы также получили массив arguments[], который содержит аргументы и может использоваться в цикле, что-то вроде этого:

function test(one,two,three) {
  i=0;
  while(typeof(arguments[i]) != 'undefined') {
    alert(arguments[i++]);
  }
}

test(40,27,399);
1 голос
/ 02 декабря 2010

Я сомневаюсь, что вы найдете что-нибудь значительно короче и проще, чем if(!title)title='DefaultTitle' для аргументов функции.

Однако я бы даже использовал более длинную форму, чтобы сделать ее более явной: if (title===null) title='DefaultTitle'.

Вот связанный вопрос с ответом, но я думаю, что это только усложнит ваш код. Как я могу получить динамический доступ к локальной области в javascript?

0 голосов
/ 02 декабря 2010

В общем, особенно в Javascript, чисто! = Коротко.

Не используйте if(!title){ title= 'Oops!'; } в качестве общего решения, потому что, например, 0 и пустая строка тоже ложные.Аргументы, которые не установлены, undefined, поэтому я предпочитаю использовать

if (title === undefined) {
    title= 'Oops!'; 
}

Это может быть более многословным, но это предотвратит нежелательные побочные эффекты, и, по моему опыту, Javascript генерирует многонежелательных побочных эффектов, если вы попытаетесь использовать ярлыки.

0 голосов
/ 02 декабря 2010

Вот другой подход. Функция argsOK немного сложна, но вызвать ее легко.

//-----------------------------------------------------
/*
PURPOSE Ensures a function received all required arguments, no extra 
        arguments & (if so specified) no arguments are empty.
RETURNS True if the arguments validate, else false.
*/
function argsOk(
    functionCallee  ,   // Caller's callee object
    allArgsRequired ,   // True = All arguments are required
    emptyArgsAllowed    // True = Empty arguments are allowed
){
    var ok = true;
    for (var i = 0; i < 1; ++i) {
        var functionName = functionCallee.toString().split(' ')[1].split('(')[0];
        var args = functionCallee.arguments;
        var expectedArgCount = functionCallee.length;
        var actualArgCount  = args.length;
        if ((allArgsRequired && actualArgCount < expectedArgCount) ||
            (actualArgCount > expectedArgCount)) {
            error("Function " + functionName + " expected " + expectedArgCount + " arguments, but received " + actualArgCount + ".");
            ok = false;
            break;
        }
        if (emptyArgsAllowed) {
            break;
        }
        for (var j = 0; j < args.length; ++j) {
            if (args[j] != null && args[j].length == 0) {
                error("Function " + functionName + "() received an empty argument.");
                ok = false;
                break;
            }
        }
    }
    return ok;
}

Пример вызова (однострочный, как видите):

//------------------------------------------------
function image(item, name, better)
// PURPOSE Write a request for picture or photo
// ENTRY        Init() has been called
{
    if (!showingShortVersion()) {
        var betterString = '';
        if (better != null && better == true)
            betterString = 'better ';
        if (argsOk(arguments.callee, true, false))
            write('<p class="request maintain">If you have ac&shy;cess to a ' + betterString + item + ' of ' + name + ' that we could put on&shy;line, please <a href="misc/pics.htm" onmouseover="return stat(\'Learn how to send us images\')" onmouseout="return erase()">click here</a>.</p>');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...