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é!
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.)
Que diriez-vous:
this.hasWheels = (typeof hasWheels !== 'undefined') ? hasWheels : true;
Votre autre option est:
this.hasWheels = arguments.length > 0 ? hasWheels : true;
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
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.