Я читаю Руководство Mozilla по JavaScript, и я подошел к этому моменту в своем чтении, логический объект . Я не вижу для них одноразового использования. В чем их суть? Почему бы вам не использовать только true
и false
?
Кстати, я вообще не знаю Java и не боюсь изучать новые вещи, которые, следовательно, почему я пытаюсь изучить JavaScript. Я программист PHP, бэкенд-парень, и я хотел бы научиться делать некоторую работу переднего плана, поэтому я читаю Mozilla JavaScript Guide .
Поскольку (как это ни печально) был определен язык - я подозреваю, что он изначально был для производительности / оптимизации; обратите внимание на случай присвоения свойства 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)
является истинно-ценностным значением.
Удачного кодирования.
Создание нового логического объекта «в основном» запускает бит кода в инструкции, а затем оттуда возвращает истинное логическое значение.
Из тех же документов:
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
Возможно, потому что объекты JavaScript расширяются так, как не примитивы? (Я просто догадываюсь, у меня никогда не было необходимости в Boolean.
Из документации:
Не путайте примитивные логические значения 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
Boolean.prototype.bang = function() {
return !this.valueOf();
}
true.bang(); // false
Все в JavaScript это объект. Но в то же время у нас есть и примитивы. Это действительно сбивает с толку, просто не думайте об этом.
Вы можете принудительно установить true или false из любого значения с помощью return Boolean(something)
, но короче написать return !!something
, что также вызывает true или false.
Я должен был бы принять сторону большинства людей здесь, что нет особой необходимости в булевом объекте, но я хочу отметить пару вещей.
Явное сравнение будет по-прежнему оцениваться как логическое значение:
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.
Возвращаясь к спецификации (ECMA-262.pdf, стр. 151), обратите внимание, что когда Boolean вызывается как функция, а не как конструктор, он выполняет преобразование типов. Таким образом:
var t = 5
, f = 0
console.log(Boolean(t)) //Prints true
console.log(Boolean(f)) //Prints false
Конечно, будучи объектом JavaScript, вы можете использовать его как прототип, используя оператор 'new', как уже отмечали другие, но я не вижу никакой причины для этого.