Javascript '';而不是仅仅检查;“真实的”;或;“法尔西”;存在

Javascript '';而不是仅仅检查;“真实的”;或;“法尔西”;存在,javascript,boolean,Javascript,Boolean,回复:

回复:

因此,我的问题是,这是
比简单地检查虚假或真实的存在更可靠吗?例如,我可以这样做:

return !!(this.services[0] && this.services[0].service);
或者我可以这样做:

if (this.services[0] && this.services[0].service) {
  return true;
} else {
  return false;
}

这些功能等效吗

是的,它们在功能上是等价的
if
使用与
完全相同的贯穿性概念操作员。但是,一条语句是简洁的,另一条是无用的样板。

&&
返回第一个错误值,因此
!!(val1&&val2)
如果您确实需要布尔值的一致性,则可能会更好

例如,如果您正在查看表达式的更改(如AngularJS中的更改):


如果
val1
开始时
undefined
,则
val1和&val2
将计算为
undefined
。如果
val1
以后变为
false
,则
val1和&val2
将计算为
false
。所以你的观察者会在你不想的时候再次执行!所以最好看
!!(val1和&val2)

如果您添加一个
else{return false;}
,它们是等价的,是的。您不会使用
if
的条件下,但是如果你想要一个一致的返回类型,比如这里,这很重要。你是在问它是否有用,还是专门针对你的案例?@shmosel,我是在问它们的功能是否等效。听上去,除了一个比另一个更简洁之外,就我上面的例子来说,它们是。你在把苹果和桔子做比较<代码>
不是检查值的另一种方法,而是将值从一种类型更改为另一种类型。那么,同样,您是在询问您的特定示例还是一般用例?不存在
a
b
的任何值,因此
if(a&&b){return true}else{return false}
将产生不同的值
return!!(a和b)
。出色的区分。我可以看到,在我的用例中!!更强壮。这实际上发生在我身上。我有一个经过优化的API,在将
C
对象序列化为
JSON
时,它省略了
null
false
属性。因此,当属性到达浏览器时,它们是未定义的。后来,当我在JavaScript中将其中一个
undefined
属性设置为
false
时,我的观察者执行了。
$scope.$watch(() => val1 && val2, (newVal, oldVal) => { 
    //... 
});