В чем смысл объекта Boolean?

Я читаю Руководство Mozilla по JavaScript, и я подошел к этому моменту в своем чтении, логический объект . Я не вижу для них одноразового использования. В чем их суть? Почему бы вам не использовать только true и false ?

Кстати, я вообще не знаю Java и не боюсь изучать новые вещи, которые, следовательно, почему я пытаюсь изучить JavaScript. Я программист PHP, бэкенд-парень, и я хотел бы научиться делать некоторую работу переднего плана, поэтому я читаю Mozilla JavaScript Guide .

26
задан hippietrail 11 October 2019 в 07:52
поделиться

8 ответов

Поскольку (как это ни печально) был определен язык - я подозреваю, что он изначально был для производительности / оптимизации; обратите внимание на случай присвоения свойства string ниже. (Java работает аналогично, хотя Scala и Python в значительной степени отвергают это различие).

Обратите внимание, что Boolean не единственный «тип оболочки». Есть также String и Number, например.

Из-за этого остается ряд причуд (нижеследующее может в той же степени относиться и к логическим значениям):

typeof("foo") // string
typeof(new String("foo")) // object
"foo" instanceof String // false
new String("foo") instanceof String // true

// result is undefined: a string is a primitive and silently "ate" the assignment
// this also makes it a much cheaper value as it's not a "real" object
x = "f"; x.bar = 42; x.bar

// result is 42: a String is a "real" object with real properties!
// however, this also means that it may have a good bit more overhead
x = new String("f"); x.bar = 42; x.bar

Я знаю, что это не «ответило» на вопрос, а скорее отбросило еще дрова в огне; -)

Единственная реальная «добыча» в противном случае из вышесказанного заключается в том, что, возможно, new Boolean(false) является истинно-ценностным значением.

Удачного кодирования.

13
ответ дан 28 November 2019 в 07:16
поделиться

Создание нового логического объекта «в основном» запускает бит кода в инструкции, а затем оттуда возвращает истинное логическое значение.

Из тех же документов:

1 var b = new Boolean(false);
2 if (b) // this condition evaluates to true

https://developer.mozilla.org/en/JavaScript/Guide/Statements#if...else_Statement

6
ответ дан 28 November 2019 в 07:16
поделиться

Возможно, потому что объекты JavaScript расширяются так, как не примитивы? (Я просто догадываюсь, у меня никогда не было необходимости в Boolean.

5
ответ дан 28 November 2019 в 07:16
поделиться

Из документации:

Не путайте примитивные логические значения true и false с истинными и ложными значениями логического объекта. Любой объект, значение которого не равно undefined, null, 0, NaN или пустой строке, включая логический объект, значение которого равно false, оценивается как true при передаче в условный оператор.

Представьте себе следующий сценарий:

if(SomeBoolean){...}

будет истинным в сценариях, где SomeBoolean является логическим объектом.

И наоборот:

if(false){...}

будет всегда ложным

Приложение для разъяснения.

var someString = new Boolean("MyNonEmptyString")
if(someString) //true
var otherString = new Boolean("")
if(otherString) //false
3
ответ дан 28 November 2019 в 07:16
поделиться
Boolean.prototype.bang = function() {
    return !this.valueOf();
}

true.bang(); // false

Все в JavaScript это объект. Но в то же время у нас есть и примитивы. Это действительно сбивает с толку, просто не думайте об этом.

4
ответ дан 28 November 2019 в 07:16
поделиться

Вы можете принудительно установить true или false из любого значения с помощью return Boolean(something), но короче написать return !!something, что также вызывает true или false.

3
ответ дан 28 November 2019 в 07:16
поделиться

Я должен был бы принять сторону большинства людей здесь, что нет особой необходимости в булевом объекте, но я хочу отметить пару вещей.

Явное сравнение будет по-прежнему оцениваться как логическое значение:

var someBool = new Boolean(false);
if (someBool == false)
    alert('Got here'); //Alerts 'Got here'

Из-за этого вы можете своего рода расширить его до подкласса и при этом иметь возможность сравнивать работу. как указано выше:

var classExtension = {
    toYN: function() {
        return this == false ? 'N' : 'Y';
    }
};

function getNewClass(val) {
    var newBool = new Boolean(val);
    jQuery.extend(newBool, classExtension);
    return newBool;
}

var newTest = getNewClass(false);
if (newTest)
    alert('It\'s alive');
if (newTest == false)
    alert('And still a bool');
alert(newTest.toYN());

Это будет предупреждать «Он жив», «И все еще бул» и «N». http://jsfiddle.net/fkJuk/

Но опять же, понадобится ли вам это когда-нибудь? Даже если бы вы это сделали, вероятно, было бы лучше иметь свой собственный отдельный класс с логическим свойством, которое проверяется. В конце концов, это, вероятно, здесь для последовательности; каждый примитив имеет прямой доступ к конструктору и прототипу в JavaScript.

1
ответ дан 28 November 2019 в 07:16
поделиться

Возвращаясь к спецификации (ECMA-262.pdf, стр. 151), обратите внимание, что когда Boolean вызывается как функция, а не как конструктор, он выполняет преобразование типов. Таким образом:

var t = 5
  , f = 0

console.log(Boolean(t))  //Prints true
console.log(Boolean(f))  //Prints false

Конечно, будучи объектом JavaScript, вы можете использовать его как прототип, используя оператор 'new', как уже отмечали другие, но я не вижу никакой причины для этого.

0
ответ дан 28 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: