Подтвердить что ты не робот

Какая точка булевого объекта?

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

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

4b9b3361

Ответ 1

Потому что это (несколько печально), как был определен язык. Я подозреваю, что это было изначально для производительности/оптимизации; обратите внимание на случай назначения для свойства 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 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) является значением истины y.

Счастливое кодирование.

Ответ 2

JavaScript-язык имеет довольно много пыльных углов, а булевский - один из них; он не используется на практике.

Это:

var a = [];
alert(a instanceof Array);

скажет вам "правда". Но это:

var b = true;
alert(b instanceof Boolean);

по какой-то причине будет отображаться "false".

Вкратце: забудьте об этом.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Boolean.prototype.bang = function() {
    return !this.valueOf();
}

true.bang(); // false

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

Ответ 6

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

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

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

if(SomeBoolean){...}

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

И наоборот:

if(false){...}

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

Добавление для уточнения.

var someString = new Boolean("MyNonEmptyString")
if(someString) //true
var otherString = new Boolean("")
if(otherString) //false

Ответ 7

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

Ответ 8

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

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

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\ alive');
if (newTest == false)
    alert('And still a bool');
alert(newTest.toYN());

Это будет предупреждать "Это живое", "И все равно -" bool "и" N ". http://jsfiddle.net/fkJuk/

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

Ответ 9

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

var t = 5
  , f = 0

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

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