2010-12-02 32 views
1

Alors, cela me arrive assez souvent, mais voici mon dernier un:façon de vérifier un tas de paramètres s'ils sont définis ou non en JavaScript

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>' 
     }); 
    } 

Y at-il un moyen plus propre pour vérifier tous les params comme title et msg ci-dessus et OU les définir comme facultatif OU définir les valeurs par défaut dans la fonction comme PHP le fait par exemple? Parfois, je pourrais avoir 10 options et if(!var){var='defaults'} x 10 est icky ...

Répondre

1

Je doute que vous trouverez quelque chose de beaucoup plus court et plus simple que if(!title)title='DefaultTitle' pour les arguments de fonction.

Cependant, j'utiliserais même la forme la plus longue pour la rendre plus explicite: if (title===null) title='DefaultTitle'.

Voici une question connexe avec une réponse, mais je pense que cela rendrait votre code plus compliqué. How can I access local scope dynamically in javascript?

1

Vous pouvez utiliser la notation ternaire comme recommended by this article mais sous une forme plus simple:

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

Vous avez également le tableau arguments[] qui contient les arguments et pourrait être utilisé dans une boucle, quelque chose comme ceci:

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

test(40,27,399); 
1
switch (arguments.length) { 
    case 0: title = 'Oops'; 
    case 1: message = 'Something must have gone wrong...'; 
} 
+0

+1 Cette méthode 'switch-case' est probablement meilleure que celle de ma boucle' while' ... – Ben

4

un peu plus courte, mais équivalent à ce que vous faites est maintenant d'utiliser « || » AKA "ou" AKA "l'opérateur par défaut".

title = title || 'Oops!'; 
msg = msg || 'Something must have gone wrong, but no worries we\'re working on it!'; 
0

Voici une autre approche. La fonction argsOK est un peu complexe, mais l'appeler est facile.

//----------------------------------------------------- 
/* 
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; 
} 

Exemple de l'appeler (en une ligne, comme vous pouvez le voir):

//------------------------------------------------ 
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>'); 
    } 
} 
0

En général, en particulier en Javascript, propre = court!.

N'utilisez pas if(!title){ title= 'Oops!'; } comme solution générale , car par ex. 0 et la chaîne vide sont aussi une falsification. Les arguments qui ne sont pas définis, sont undefined, donc je préfère utiliser

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

Il peut être plus verbeux de le faire, mais elle permet d'éviter des effets secondaires indésirables, et dans mon expérience, Javascript génère beaucoup d'effets secondaires indésirables , si vous essayez d'utiliser des raccourcis.