我正在阅读关于JavaScript的Mozilla手册,我在阅读时已经到了这一点Boolean object。我看不到他们的一个用途。他们有什么意义?为什么不只使用true
和false
?
顺便说一句,我根本不懂Java,我不怕学习新东西,因此我为什么要学习JavaScript。我是一个PHP程序员,一个后端人,我想学习如何做一些前端工作,所以我正在阅读Mozilla JavaScript Guide。
答案 0 :(得分:13)
因为(有点可悲)如何定义语言 - 我怀疑它最初是为了性能/优化;请注意分配给下面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 :(得分:10)
JavaScript语言设计有很多尘埃落定的角落,而布尔就是其中之一;它没有在实践中使用。
此:
var a = [];
alert(a instanceof Array);
会告诉你“真实”。但是这个:
var b = true;
alert(b instanceof Boolean);
由于某种原因会显示“假”。
简而言之:忘记它。
答案 2 :(得分:6)
创建一个新的布尔对象“基本上”在语句中运行代码位,然后从那里返回真正的布尔值。
来自相同的文档:
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
答案 3 :(得分:5)
也许是因为JavaScript对象可以通过原语不可扩展的方式进行扩展? (我只是在这里猜测,我从来没有需要布尔。
答案 4 :(得分:4)
Boolean.prototype.bang = function() {
return !this.valueOf();
}
true.bang(); // false
JavaScript中的所有内容都是一个对象。但与此同时我们也有原始人。这真的很令人困惑,只是不要过度思考它。
答案 5 :(得分:3)
来自文档:
不要混淆原始布尔值 值为true和false,为true 和布尔值的错误值 宾语。任何值不是的对象 undefined,null,0,NaN或空 string,包括一个Boolean对象 其值为false,评估为 传递给条件时为true 言。
想象一下以下场景:
if(SomeBoolean){...}
在SomeBoolean
是布尔对象的情况下,将成立。
相反:
if(false){...}
将始终为假
澄清补遗。
var someString = new Boolean("MyNonEmptyString")
if(someString) //true
var otherString = new Boolean("")
if(otherString) //false
答案 6 :(得分:3)
你可以使用return Boolean(something)
来强制任何值的真或假,但写return !!something
会更短,这也会强制为真或假。
答案 7 :(得分:1)
我不得不与大多数人站在一起,不需要布尔对象,但我想指出一些事情。
显式比较仍将像布尔值一样进行评估:
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中的直接构造函数和原型访问。
答案 8 :(得分:0)
回到规范(ECMA-262.pdf第151页),请注意当布尔值作为函数而不是构造函数调用时,它会进行类型转换。因此:
var t = 5
, f = 0
console.log(Boolean(t)) //Prints true
console.log(Boolean(f)) //Prints false
当然,作为一个JavaScript对象,您可以使用'new'运算符将其用作原型,正如其他人所指出的那样,但我认为没有任何理由这样做。