2009-05-13 3 views

Odpowiedz

56

Funkcja globalna Boolean() mogą być wykorzystywane do typu odlewania gdy wywołana bez new np

var foo = Boolean(bar); // equivalent to `var foo = !!bar` 

Wywołany z new, obiekt wrapper będą tworzone dodatkowo, co oznacza, że ​​można przypisać dowolne właściwości do obiekt:

var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));` 
foo.baz = 'quux'; 
alert(foo.baz); 

nie jest to możliwe przy wartościach pierwotnych jako prymitywy nie mogą posiadać właściwości:

var foo = true; 
foo.baz = 'quux'; 
alert(foo.baz); // `foo.baz` is `undefined` 

Przypisywanie właściwości do prymitywny nie wywołuje błąd, ponieważ auto-boxingu, tj

foo.baz = 'quux'; 

będą interpretowane jako

// create and immediately discard a wrapper object: 
(new Boolean(foo)).baz = 'quux'; 

Aby uzyskać wartość prymitywną powrotem, ty Będzie musiał wywołać metodę valueOf(). Jest to konieczne, jeśli chcesz faktycznie użyć wartości zawiniętej, ponieważ obiekty zawsze oceniają na true w kontekstach logicznych - nawet jeśli wartością zawiniętą jest false.

Nigdy nie natknąłem się na użyteczną aplikację polegającą na możliwości przypisania właściwości do zmiennych logicznych, ale boks może być przydatny w przypadkach, gdy potrzebne jest odniesienie do wartości pierwotnej.

+1

Wywołanie metody Boolean (someVar) może być przydatne do rzutowania na podstawowy element logiczny, ale pamiętaj, że Boolean (false) == false, ale nowy Boolean (false) == true, ponieważ jest to obiekt – jackocnr

+0

Nie zawsze musisz używać 'valueOf' - będzie on wywoływany automatycznie, gdy będzie potrzebny prymityw. Na przykład 'boolean_object === true' zwiąże obiekt z jego podstawowym prymitywem (ale'! Boolean_object' nie będzie). –

+1

@torazaburo: '===' nie zmusza - 'nowy Boolean (true) === true' jest fałszywy – Christoph

17

Podczas gdy inni wspomniano teorię, pozwól mi mówić o części praktycznej:

ponieważ Boolean przedmiotów (jak obiekty w ogóle), są zawsze truthy uważa się, złe praktyki z nich korzystać. W ciągu wielu lat programowania JS, nigdy ich nie używałem i nie pamiętam, żeby widziały Boolean s również w kodzie innych ludzi. Ani razu.

Użycie wartości pierwotnych pozwoli uniknąć zamieszania i sprawi, że kod będzie trochę krótszy.

Jeśli kiedykolwiek potrzeba bool zawinięte w obiekcie, równie dobrze można użyć obiektu Object tak:

foo = { value: false }; 

Również wywołanie konstruktora Boolean() jako funkcję (jak w foo = Boolean(bar)) ma takie same efekt taki jak wyraźny typing przy użyciu !!, a ten drugi jest zazwyczaj preferowany w porównaniu z pierwszym.

+1

Żądasz ogólnej preferencji dla pary * nie * operatorów' !! '. Ale cel i efekt '!!' wydaje się mniej oczywisty niż konwencjonalny konwerter 'Boolean()' i zastanawiam się, czy tutaj nie chodzi o klarowność kodu. –

6

Skały klasy Boolean. Zamiast tego kodu spaghetti:

if (foo===true) this.launch(); 
else this.dontLaunch(); 

Możesz zrobić to, co zrobiłby wielki programista i rozszerzyć prototyp!

Boolean.prototype.ifTrue=function(ifFunc,elseFunc){ 
    if (this.valueOf()===true) ifFunc(); 
    else elseFunc(); 
} 
var foo=new Boolean(/*expression*/); 
foo.ifTrue(this.launch.bind(this),this.dontLaunch.bind(this)); 

Znacznie lepiej teraz.

+6

Czasami wolę "wyrażenie"? this.launch(): this.dontLaunch() "Pomyśl, że twój drugi przykład jest jeszcze gorszy spaghetti – Endless

+2

Cóż, prototyp Booleans zostanie rozszerzony na samym szczycie pliku, foo zostanie zadeklarowane w miejscu, w którym deklarowane są zmienne, oraz Metody ifTrue byłyby uruchamiane w odpowiednich przypadkach. W każdym razie - ta odpowiedź nie jest naprawdę poważna. Rodzaj satyry na funkcjonalne programowanie i rozszerzanie prototypu. –

+0

Jak cudownie! Od tej chwili będzie to następować :) – mlvljr

-1

Ciekawe pytanie:

użyć nowego Boolean stworzyć logiczną obiektu. Może być wiele scenariuszy, ale omówiłem poniżej jeden scenariusz.

Załóżmy, że chcesz porównać w kodzie, w którym chcesz dopasować wartość ciągu i jego typ danych i ma ona wartość bool (true/false), wtedy zamiast przypisywania prostej fałszywej wartości użyjesz nowej wartości boolowskiej.

var flag = false; 
var flag2 = new Boolean (false); 
alert(typeof flag); //boolean object 
alert(typeof flag2); //simple object 

if (flag === flag2){ 
    alert("Value and datatype match"); 
} 
else{ 
    alert("Value and datatype do not match"); 
} 
0

Przed powyższym pytaniu pierwszym funkcji logicznej, Boolean()

Boolean(10 > 4) // return true 
Boolean(4 > 9) // return false 

Następny: wszystko z powrotem prawdziwe wartości prawdziwej. Np

100 
-4 
4.4 
"hello" 
"false" // note even the string value false return true. 

everthing bez realnej wartości return false np

NaN 
var x = 10/"H"; // Boolean(x); return false. 
undefined 
"" 
0 
-0 
false 
null 

Teraz obiekt Boolean jest wrapper obiekt o wartości logicznej. Wartość przekazana jako pierwszy parametr jest w razie potrzeby konwertowana na wartość logiczną. Jeśli wartość jest pominięta lub jest 0, -0, null, false, NaN, undefined lub pusty ciąg (""), obiekt ma wartość początkową false. Wszystkie inne wartości, w tym dowolny obiekt lub ciąg "false", tworzą obiekt o wartości początkowej true.

Pozwala to na bardzo skuteczne triki.