不太了解Boolean()函数

时间:2016-07-10 17:21:50

标签: javascript

这两个在功能上是否相同?如果是,那么(重要)如何?

arr.filter(function(val){
  return Boolean(val)
});

arr.filter(Boolean);

另外,这两者在功能上是否相同?

var x = new Boolean(expression);

var x = Boolean(expression);

2 个答案:

答案 0 :(得分:4)

第二个不,使用new的那个创建一个Boolean实例,而另一个只返回传递给它的布尔等价物,例如将一个truthy / falsy值转换为实际的布尔值true /虚假价值。



console.log( "Is instance: ", (new Boolean(true)) instanceof Boolean );
console.log( "Is not instance: ", Boolean(true) instanceof Boolean );

console.log("truthy to bool: ", Boolean(-1) );
console.log("falsey to bool: ", Boolean(0) );
console.log("falsey to bool: ", Boolean("") );
console.log("truthy to bool: ", Boolean("test") );




它们在条件语句中如何使用它们也有所不同。例如,您可以在条件

中单独使用原始布尔值
if(true) // 
if(false) //

但是如果你尝试单独使用布尔实例进行测试,则条件将始终为true,因为它是一个对象,并且所有对象都是真实的,甚至是空对象

var d = new Boolean(false);
if(d){
   console.log("Gets called even though the Boolean instance holds a false value");
}

第一个是等价的,因为它们会产生相同的结果,因为在这两种情况下,布尔值都将返回到filter内部。

arr.filter(Boolean);

Boolean此处用作回调方法,并直接从布尔值的返回值中获取返回值。

在做的时候

arr.filter(function(val){
  return Boolean(val)
});

使用匿名函数作为回调方法,因此从Boolean间接返回值。但是在这两种情况下都会将值传递给Boolean然后返回,结果是相同的。

请注意,下面的内容不一样:

arr.filter(function(val){
  return new Boolean(val);
});

如上所述,Boolean的实例是一个对象,它总是一个真值。所以在上面的例子中,数组的所有元素都会通过测试,因此你最终会得到你试图过滤的相同数组。

使用匿名函数可以让你在最终处理/返回val作为布尔值之前做其他事情,例如在将val传递给Boolean之前操纵OTHER_CFLAGS

答案 1 :(得分:0)

第一段,这些功能相同。

第二个版本,这些将导致不同的值。第一个将导致Boolean对象实例具有truthy / falsey值,第二个将导致原始 truthy / falsey值。

了解更多here