在JavaScript中给出
console.log("var F=new Boolean(false)")
console.log("( F != (F==false))",(( F != (F==false)) ? "TRUE" : "false"));
console.log("(!F != (F==false))",((!F != (F==false)) ? "TRUE" : "false"));
打印:
( F != (F==false)) TRUE
(!F != (F==false)) TRUE
这意味着布尔对象在典型条件下不是dop-in替代布尔基元,如:
if(someBoolean) ... // always true
if(!someBoolean) ... // always false
JavaScript的Set
和Map
集合允许任何类型,包括基元。
特别是布尔对象有什么用处;和一般表示其他原始类型的对象,因为它们在与它们相关的一致性方面有各种奇怪的东西?
注意:我具体要求用例(如果有的话),而不是它们与原始对应物的区别。
答案 0 :(得分:19)
布尔对象只是对象,因此是真实的。
console.log(!!new Boolean(true)); // true
console.log(!!new Boolean(false)); // true
存在布尔对象,因为这样你可以将方法添加到Boolean.prototype
并在原始布尔值上使用它们(它们将被包装在引擎盖下的booolean对象中)。
Boolean.prototype.foo = function() {
console.log("I'm the boolean " + this + "!!");
};
true.foo();
false.foo();
当您想要将属性存储在布尔值中时,它们也很有用。
var wrappedBool = new Boolean(false);
wrappedBool.foo = "bar";
console.log("Property foo: ", wrappedBool.foo); // "bar"
console.log("Unwrapped bool: ", wrappedBool.valueOf()); // false
但不建议这样做。
答案 1 :(得分:4)
说我们有......
var F = new Boolean();
var f = false;
F 是 对象 , f 是 原语 强>
对象由引用传递。基元通过值 传递。
无论对象的类型是什么,它始终保持其个性;身份。它的行为就像一个真实的(物质)物体,在宇宙中占据了自己独特的空间。
因此......
var Fn = new Boolean();
不等于'到F,即使与动态类型操作符进行比较' =='即使它们属于同一类型且具有相同的值:
Fn == F;
>> false
那是因为(已经加下划线),它们是两个独立的&携带相同值的项目的不同对象,即。, false 。尽管如此 - 不一样 false 。
并且,因为没有类型转换(因为它们已经是相同类型),它们将通过引用进行比较 - 这显然指向两个单独的对象, 意思是: 它们不是同一个对象!
我们应该将给定类型的JavaScript对象想象为专门用于携带某种类型的贵重物品的数据包。这种思维方式将使我们更容易理解我们工作中最意想不到的结果。这就是为什么 null 很漂亮。
实际值(可能已经)的用例,某个布尔对象可以携带两个值但保持相同(可识别)对象。唉,在JavaScript开发中,Boolean对象一直处于初始引入状态。现在几乎没用,只能用来确定这个错误:真正的价值来自不同的流程,而返回也是你比较它的那个。
问候。