这两个在功能上是否相同?如果是,那么(重要)如何?
arr.filter(function(val){
return Boolean(val)
});
arr.filter(Boolean);
另外,这两者在功能上是否相同?
var x = new Boolean(expression);
var x = Boolean(expression);
答案 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。