Глобальная функция Boolean()
может использоваться для приведения типа при вызове без new
, например,
var foo = Boolean(bar); // equivalent to `var foo = !!bar`
При вызове с помощью new
дополнительно создается объект-обертка, что означает, что вы можете назначить объекту произвольные свойства:
var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));`
foo.baz = 'quux';
alert(foo.baz);
Это невозможно с примитивными значениями, так как примитивы не могут содержать свойства:
var foo = true;
foo.baz = 'quux';
alert(foo.baz); // `foo.baz` is `undefined`
Присвоение свойства примитиву не приводит к ошибке из-за автобокса, т.е.
foo.baz = 'quux';
будет интерпретироваться как
// create and immediately discard a wrapper object:
(new Boolean(foo)).baz = 'quux';
Чтобы вернуть значение примитива, вам нужно вызвать метод valueOf()
. Это необходимо, если вы действительно хотите использовать упакованное значение, потому что объекты всегда оцениваются в true
в логических контекстах - даже если упакованное значение равно false
.
Я никогда не сталкивался с полезным приложением, позволяющим присваивать свойства логическим значениям, но бокс может быть полезен в тех случаях, когда требуется ссылка на примитивное значение.