web-dev-qa-db-fra.com

Comment définir des valeurs booléennes par défaut en JavaScript?

La définition des valeurs facultatives par défaut en JavaScript se fait généralement via le || personnage

var Car = function(color) {
  this.color = color || 'blue';
};

var myCar = new Car();
console.log(myCar.color); // 'blue'

var myOtherCar = new Car('yellow');
console.log(myOtherCar.color); // 'yellow'

Cela fonctionne parce que color est undefined et undefined || String est toujours le String. Bien sûr, cela fonctionne également dans l'autre sens String || undefined est String. Lorsque deux Strings sont présents, le premier gagne 'this' || 'that' est 'this'. Cela ne fonctionne PAS dans l'autre sens comme 'that' || 'this' est 'that'.

La question est: comment puis-je obtenir la même chose avec des valeurs booléennes?

Prenez l'exemple suivant

var Car = function(hasWheels) {
  this.hasWheels = hasWheels || true;
}

var myCar = new Car();
console.log(myCar.hasWheels); // true

var myOtherCar = new Car(false)
console.log(myOtherCar.hasWheels); // ALSO true !!!!!!

Pour myCar cela fonctionne car undefined || true est true mais comme vous pouvez le voir, cela ne fonctionne PAS pour myOtherCar car false || true est true. Changer la commande n'aide pas car true || false est toujours true.

Par conséquent, ai-je oublié quelque chose ici ou est-ce la seule façon de définir la valeur par défaut?

this.hasWheels = (hasWheels === false) ? false: true

À votre santé!

54
zemirco

Tu peux le faire:

this.hasWheels = hasWheels !== false;

Cela vous donne une valeur true sauf lorsque hasWheels est explicitement false. (D'autres valeurs fausses, y compris null et undefined, donneront true, ce qui, je pense, est ce que vous voulez.)

115
Ted Hopp

Que diriez-vous:

this.hasWheels = (typeof hasWheels !== 'undefined') ? hasWheels : true;

Votre autre option est:

this.hasWheels = arguments.length > 0 ? hasWheels : true;
6
Chris Cooper

Vous pouvez utiliser la fonction Paramètres de fonction par défaut dans ECMA6. Aujourd'hui, ECMA6 n'est toujours pas entièrement pris en charge dans le navigateur, mais vous pouvez utiliser babel et commencer à utiliser les nouvelles fonctionnalités immédiatement.

Ainsi, l'exemple d'origine deviendra aussi simple que:

// specify default value for the hasWheels parameter
var Car = function(hasWheels = true) {
  this.hasWheels = hasWheels;
}

var myCar = new Car();
console.log(myCar.hasWheels); // true

var myOtherCar = new Car(false)
console.log(myOtherCar.hasWheels); // false
3
kmandov

Il y a des variations à noter par rapport aux réponses publiées.

var Var = function( value ) {
    this.value0 = value !== false;
    this.value1 = value !== false && value !== 'false';
    this.value2 = arguments.length <= 0 ? true : arguments[0];
    this.value3 = arguments[0] === undefined ? true : arguments[0];
    this.value4 = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
};

                     value0   value1   value2        value3         value4
---------------------------------------------------------------------------
Var("")              true     true     true          true           true
Var("''")            true     true     ''            ''             ''
Var("0")             true     true     0             0              0
Var("'0'")           true     true     '0'           '0'            '0'
Var("NaN")           true     true     NaN           NaN            NaN
Var("'NaN'")         true     true     'NaN'         'NaN'          'NaN'
Var("null")          true     true     null          null           null
Var("'null'")        true     true     'null'        'null'         'null'
Var("undefined")     true     true     undefined     true           true
Var("'undefined'")   true     true     'undefined'   'undefined'    'undefined'
Var("true")          true     true     true          true           true
Var("'true'")        true     true     'true'        'true'         'true'
Var("false")         false    false    false         false          false
Var("'false'")       true     false    'false'       'false'        'false'
  • value1 est fabriqué spécialement à partir de value0 pour la chaîne 'false' si on a besoin qu'elle soit booléenne false. J'ai trouvé cette relaxation utile à l'occasion.
  • value2 et value3 sont des modifications des réponses publiées d'origine pour des raisons de cohérence, sans changement des résultats.
  • value4 est la façon dont Babel compile les paramètres par défaut.
3
Season