在JavaScript中,Boolean对象有什么实际用途?

16

考虑到在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

这意味着在典型情况下,布尔对象不能替代布尔原语,比如:

if(someBoolean) ...  // always true
if(!someBoolean) ... // always false

同时,JavaScript的SetMap集合允许包括基础数据类型在内的任何类型。

布尔对象有什么用呢?其他基础数据类型的对象一般也存在各种奇怪的不一致性,那么它们有什么用处呢?

注意:我特别想知道它们有哪些使用场景(如果有),而不是它们与其基础类型有何不同之处。


1
这篇文章可能会提供一些见解。我没有标记它为重复,因为它已经有7年了,可能已经过时了。 - Wondercricket
这有帮助吗?https://dev59.com/SXRA5IYBdhLWcg3wtwSe - Javid Asgarov
另外:https://dev59.com/RW025IYBdhLWcg3wOzXY FWIW,WeakMap的键必须是对象,即(new WeakMap).set(true, "foo")会引发错误,而(new WeakMap).set(Boolean(true), "foo")则不会。 - Jordan Running
1
@askerovlab:不完全是。那里的答案讨论了差异和一些陷阱,但没有讨论对象的实际使用情况。 - Lawrence Dol
1
我真的不认为有任何实际用途。 试着找到任何不仅仅是测试兼容性的东西,无论是使用框架还是引擎。Oriol指出了您可以使用它做什么,但我不会称这些事情是实际的。 - Mike Cluck
2个回答

21

布尔对象只是一个对象,因此它们都是真实的。

console.log(!!new Boolean(true)); // true
console.log(!!new Boolean(false)); // true

布尔对象的存在是为了让您可以向 Boolean.prototype 添加方法,并在原始的布尔值上使用它们(这些值将在幕后被包装为布尔对象)。

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

但是这并不被推荐。


请解释什么是“truthy”或提供相关参考资料。为什么第一个例子有任何意义? - ThisClark
Truthy 的意思是不为 null,false,undefined,0 或空true === {} 是 true,但 true === "" 是 false。 - Baruch
1
@ThisClark Truthy 意味着当强制转换为布尔值时,它变为 true。双重否定 !!Boolean 函数是将值强制转换为布尔值的标准方法。除了原始值 undefinednullfalse-0+0NaN"" 之外,所有值都是 truthy 的。 - Oriol
此外,Boolean对象允许您使用它的valueOf方法来执行OP所要求的操作。原始对象将返回truthy,而从该方法返回的值将正确确定truthy或falsy。 var F = new Boolean(false); console.log(!F.valueOf()); // true - zfrisch
1
这并不是 Boolean 对象可以具有属性的原因。所有对象都可以具有属性,这不是故意为之的。这是固有的。null 除外。null 是:不是对象的对象。类似于数字 NaN,因此它不能接受属性。因此,不,Boolean 对象不存在,因此您无法向其添加方法。 - Bekim Bacaj
1
@BekimBacaj 我的意思是,如果布尔对象不存在,原始布尔值就无法转换为对象。在这种情况下,您将无法向 Boolean.prototype 添加方法并在原始布尔值上调用它们。 - Oriol

4

Say we have...

var F = new Boolean(); 
var f = false;

其中F是一个对象f是一个原始数据类型

对象通过引用传递。原始数据类型通过传递。

无论一个对象类型是什么,它总是保留着自己的个性和身份。它表现得像一个真实(物质)的对象,在宇宙中占据着自己独特的空间。

因此...

var Fn = new Boolean(); 

即使使用动态类型运算符“==”,并且它们是同一类型并带有相同的值,它也不等于F:

Fn == F; 
>> false

那是因为(如上所述),它们是两个分别携带相同值的不同对象,即false。然而,这仍然-不是同一个false
由于它们已经是相同类型,因此没有类型转换,它们将通过引用进行比较-显然指向两个不同的对象,意味着:它们不是同一个对象!
我们应该将JavaScript对象想象成专门设计用于携带某种类型贵重物品的包裹。这种思考方式将使我们更容易理解甚至最意外的工作结果。这就是为什么null很美丽的原因。
实际价值的使用情况(本来会是),某个布尔对象可以携带两个值但保持相同(可识别)对象。遗憾的是,在JavaScript开发中,布尔对象已被留在其初始介绍状态。现在实际上是无用的,只能用于确定此false:true值来自与您要比较的过程和返回不同的过程。
敬礼。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接