Какая точка булевого объекта?
Я читаю Руководство Mozilla по JavaScript, и я подошел к этому моменту в своем чтении, Boolean object. Я не вижу ни одного использования для них. В чем их смысл? Почему бы вам не использовать только true
и false
?
Кстати, я совсем не знаю Java, и я не боюсь изучать новые вещи, поэтому я пытаюсь изучать JavaScript. Я программист на PHP, бэкэнд, и я хотел бы узнать, как выполнять какую-то внешнюю работу, поэтому я читаю Руководство по JavaScript для Mozilla.
Ответы
Ответ 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, вы можете использовать его в качестве прототипа, используя "новый" оператор, как отмечали другие, но я не вижу причин для этого.