【发布时间】:2010-10-25 18:34:20
【问题描述】:
有什么用:
var flag = new Boolean(false);
相比:
var flag = false;
你什么时候会真正使用new Boolean?
【问题讨论】:
标签: javascript boolean
有什么用:
var flag = new Boolean(false);
相比:
var flag = false;
你什么时候会真正使用new Boolean?
【问题讨论】:
标签: javascript boolean
全局函数Boolean()可以在没有new的情况下进行类型转换,例如
var foo = Boolean(bar); // equivalent to `var foo = !!bar`
当使用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。
我从未遇到过能够将属性分配给布尔值的有用应用程序,但在需要引用原始值的情况下,装箱可能很有用。
【讨论】:
valueOf——它会在需要原语时自动调用。例如,boolean_object === true 将强制对象为其底层原语(但!boolean_object 不会)。
=== 不强制 - new Boolean(true) === true 是假的
boolean_object == true(两个等号,不是三个)WILL 强制(我很确定,刚刚测试过)。
== 确实强制 - 该算法在 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
虽然其他人提到了理论,但让我谈谈实际部分:
因为Boolean 对象(作为一般对象)总是真实的,所以使用它们被认为是不好的做法。在多年的 JS 编程中,我从未使用过它们,我也不记得在其他人的代码中看到过Booleans。一次也没有。
使用原始值可以避免混淆,并使您的代码更短。
如果您需要一个包含在对象中的 bool,您不妨像这样使用 Object 对象:
foo = { value: false };
此外,将Boolean() 构造函数作为函数调用(如在foo = Boolean(bar) 中)与使用!! 进行显式类型转换具有相同的效果,并且后者通常优于前者。
【讨论】:
!! 具有普遍偏好。但是!! 的目的和效果似乎没有传统的Boolean() 转换器那么明显,我想知道这里是否需要考虑代码清晰度。
new,这会导致Boolean Object。然后每次你都必须在条件句中使用foo.valueOf()。相反,只需将 Boolean 作为一个简单地导致类型转换的函数调用,即 Boolean(bar) === !!bar
在上面的问题之前首先是布尔函数,Boolean ()
Boolean(10 > 4) // return true
Boolean(4 > 9) // return false
下一步:所有有实值的东西都返回真。例如
100
-4
4.4
"hello"
"false" // note even the string value false return true.
没有实际价值的一切都返回假,例如
NaN
var x = 10 / "H"; // Boolean(x); return false.
undefined
""
0
-0
false
null
现在Boolean 对象是一个布尔值的对象包装器。如有必要,作为第一个参数传递的值将转换为布尔值。如果 value 被省略或者是 0, -0, null, false, NaN, undefined,或者是空字符串 (""),则该对象的初始值为 false。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为 true 的对象。
这允许使用非常强大的技巧。
【讨论】:
有趣的问题:
您使用 new Boolean 创建一个布尔对象。可能有很多情况,但我在下面讨论了一种情况。
假设您想要在代码中进行比较,其中您想要匹配字符串值及其数据类型并且它必须为 bool (true/false),那么您将使用新的 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");
}
【讨论】: