2013-03-17 12 views
41

opcjonalne ustawienie domyślne wartości w JavaScript zwykle odbywa się poprzez || charakteruJak ustawić domyślne wartości boolowskie w JavaScript?

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' 

który działa bo color jest undefined i undefined || String jest zawsze String. Oczywiście działa to również na odwrót: String || undefined to String. Gdy są dwa Strings, pierwszy wygrywa 'this' || 'that' jest 'this'. To NIE działa odwrotnie, ponieważ 'that' || 'this' jest 'that'.

Pytanie brzmi: w jaki sposób mogę osiągnąć to samo z wartościami logicznymi?

Weźmy następujący przykład

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 !!!!!! 

Dla myCar to działa bo undefined || true jest true ale jak widać to nie działa dla myOtherCar ponieważ false || true jest true. Zmiana kolejności nie pomaga, ponieważ true || false nadal jest.

W związku z tym, czy coś tu brakuje, czy jest to jedyny sposób na ustawienie wartości domyślnej?

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

Pozdrawiam!

Odpowiedz

90

Można to zrobić:

this.hasWheels = hasWheels !== false; 

Że dostaje wartość true wyjątkiem gdy hasWheels jest wyraźnie false . (Inne wartości falsy, w tym null i undefined, spowoduje true, co moim zdaniem jest to, co chcesz.)

+0

To jest mądre! Lubię to. – zemirco

+0

@zeMirco: Tak więc pytasz o wszystkie wartości falseta, z wyjątkiem "false", które należy uznać za "prawdziwe"? Jeśli tak, zastanawiałbym się, dlaczego chciałbyś użyć '||' w pierwszej kolejności. Oczywiście oczywistym testem dla "fałszu" byłoby najprostsze rozwiązanie. –

+0

@thesystem - Nie chciał używać '||'; było to po prostu przeniesieniem z użycia '||' dla wartości nie-boolowskich. Pytanie zostało zamieszczone, jak sądzę, ponieważ '||' nie robił tego, co było potrzebne. –

6

Jak o:

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

Twój Inną opcją jest:

this.hasWheels = arguments.length > 0 ? hasWheels : true; 
+2

To działa dobrze, chociaż sugeruję użycie '? !! hasWheels' zamiast '? hasWheels' gwarantuje, że 'true' lub' false' (i nic więcej) nie jest przypisane do 'this.hasWheels'. –

3

Można użyć funkcji Default function parameters w ECMA6. Obecnie ECMA6 nadal nie jest w pełni obsługiwana w przeglądarce, ale można użyć babel i zacząć od razu korzystać z nowych funkcji.

Tak, oryginalny przykładem będzie tak proste, jak:

// 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 
+1

ale jeśli ktoś przejdzie w wartości falsy (tj. Pusty ciąg) 'this.hasWheels' zostanie przypisany pusty łańcuch zamiast wartości boolowskiej. prawdopodobnie chcesz dodać 'hasWheels = (typeof hasWheels === 'boolean')? hasWheels: true; ' –

2

Istnieją odmiany mają być odnotowane z oddelegowanych z odpowiedziami.

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 jest wykonany zwłaszcza z value0 dla łańcucha 'false', jeśli trzeba, że ​​jest to logiczna fałsz. Znalazłem ten relaks w okazyjny sposób.
  • value2 i value3 są modyfikacjami oryginalnych opublikowanych odpowiedzi dla spójności, bez zmienionych wyników.
  • value4 to sposób, w jaki Babel kompiluje parametry domyślne.