Jakie jest zastosowanie:Jaki jest cel nowej metody Boolean() w JavaScript?
var flag = new Boolean(false);
porównaniu do:
var flag = false;
Kiedy byś faktycznie korzysta new Boolean
?
Jakie jest zastosowanie:Jaki jest cel nowej metody Boolean() w JavaScript?
var flag = new Boolean(false);
porównaniu do:
var flag = false;
Kiedy byś faktycznie korzysta new Boolean
?
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.
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
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). –
@torazaburo: '===' nie zmusza - 'nowy Boolean (true) === true' jest fałszywy – Christoph
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.
Żą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. –
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.
Czasami wolę "wyrażenie"? this.launch(): this.dontLaunch() "Pomyśl, że twój drugi przykład jest jeszcze gorszy spaghetti – Endless
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. –
Jak cudownie! Od tej chwili będzie to następować :) – mlvljr
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");
}
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.
Zobacz także [Do czego służy obiekt Boolean?] (Http://stackoverflow.com/q/6132949/1048572) – Bergi