Javascript 中 new Boolean() 的目的是什么?

IT技术 javascript boolean
2021-01-20 08:45:36

有什么用:

var flag = new Boolean(false); 

相比:

var flag = false;

new Boolean什么时候会真正使用

4个回答

全局函数Boolean()可用于在没有调用时进行类型转换new,例如

var foo = Boolean(bar); // equivalent to `var foo = !!bar`

当使用 with 调用时new,将额外创建一个包装对象,这意味着您可以为该对象分配任意属性:

var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));`
foo.baz = 'quux';
alert(foo.baz);

这对于原始值是不可能的,因为原始值不能保存属性:

var foo = true;
foo.baz = 'quux';
alert(foo.baz); // `foo.baz` is `undefined`

由于自动装箱,将属性分配给基元不会产生错误,即

foo.baz = 'quux';

将被解释为

// create and immediately discard a wrapper object:
(new Boolean(foo)).baz = 'quux';

要取回原始值,您必须调用该valueOf()方法。如果您想实际使用包装的值,true则需要这样做,因为对象总是在布尔上下文中评估为- 即使包装的值是false.

我从未遇到过能够将属性分配给布尔值的有用应用程序,但在需要对原始值的引用的情况下,装箱可能很有用。

@torazaburo:==强制执行 - 该算法在 ECMA-262 ed5 的第 11.9.3 节中进行了描述;转换new Boolean(false) == false回 Javascript,执行的实际比较是Number(new Boolean(false).valueOf()) === Number(false); 该算法有一些“有趣”的结果,例如new Number(0) == false即使Boolean(new Number(0)) === true
2021-03-22 08:45:36
您并不总是需要使用valueOf——它会在需要原语时自动调用。例如,boolean_object === true将对象强制为其底层原语(但!boolean_object不会)。
2021-03-23 08:45:36
@torazaburo:===不强制 -new Boolean(true) === true是假的
2021-03-30 08:45:36
调用 Boolean(someVar) 可用于转换为布尔原始类型,但请记住 Boolean(false) == false,但 new Boolean(false) == true,因为它是一个对象
2021-04-02 08:45:36
@Christoph 对不起,我的错误。然而,boolean_object == true(两个等号,而不是三个)WILL要挟(我敢肯定,只是测试它)。
2021-04-14 08:45:36

别人说的是理论,我来说说实操部分:

因为Boolean对象(作为一般对象)总是真实的,所以使用它们被认为是不好的做法。在多年的 JS 编程中,我从未使用过它们,我也不记得Boolean在其他人的代码中看到过s。一次都无。

使用原始值将避免混淆并使您的代码更短一些。

如果您需要将 bool 包裹在一个对象中,您不妨Object像这样使用一个对象:

foo = { value: false };

此外,将Boolean()构造函数作为函数调用(如在 中foo = Boolean(bar))与使用显式类型转换具有相同的效果!!,后者通常优于前者。

您声称对一对not运算符的普遍偏好!!但是 的目的和效果!!似乎没有传统Boolean()转换器那么明显,我想知道这里是否需要关注代码清晰度。
2021-04-08 08:45:36
一注。永远不要使用newwhich 结果在Boolean Object然后每次你都必须foo.valueOf()在条件中使用而只是Boolean作为一个函数调用,它只会导致类型转换,即Boolean(bar) === !!bar
2021-04-09 08:45:36

在上述问题之前先说布尔函数, Boolean ()

Boolean(10 > 4) // return true
Boolean(4 > 9) // return false

下一步:所有具有实际value的东西都返回 true。例如

100
-4
4.4
"hello"
"false" // note even the string value false return true.

没有实际value的一切都返回错误 例如

NaN 
var x = 10 / "H"; // Boolean(x); return false.
undefined
"" 
0
-0
false 
null

现在该Boolean对象是一个布尔值的对象包装器。如有必要,作为第一个参数传递的值将转换为布尔值。如果 value 被省略或 is 0, -0, null, false, NaN, undefined,或空字符串 ( ""),则对象的初始值为 false。所有其他值,包括任何对象或字符串“false”,创建一个初始值为 true 的对象。

这允许非常强大的技巧。

有趣的问题:

您可以使用 new Boolean 创建一个布尔对象。可能有很多场景,但我已经在下面讨论了一种场景。

假设您想在代码中进行比较,其中要匹配字符串值及其数据类型,并且必须为 bool (true/false),那么您将使用 new boolean 而不是分配简单的 false 值。

var flag = false;  
var flag2 = new Boolean (false);
alert(typeof flag);  //boolean object
alert(typeof flag2); //simple object

if (flag === flag2){
    alert("Value and datatype match");
}
else{
    alert("Value and datatype do not match");
}