【问题标题】:'!!' versus just checking for "truthy" or "falsy" existence“!!”而不是仅仅检查“真实”或“虚假”的存在
【发布时间】:2017-06-14 16:55:01
【问题描述】:

Re:JavaScript 中的!!,据我了解,这会将对象转换为布尔值。根据另一个 SO 线程中的答案,它“将 oObject 强制为布尔值。如果它是错误的(例如 0、null、未定义等),它将为假,否则为真。”

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

return !!(this.services[0] && this.services[0].service);

或者我可以这样做:

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

这些功能是否等效?

【问题讨论】:

  • 如果您添加else { return false; },它们是等价的,是的。你不会在if 的条件下使用!!,但如果你想要一个一致的返回类型就很重要,例如,像这里。
  • 您是在问它是否曾经有用,还是专门针对您的情况?
  • @shmosel,我在问它们是否功能等效。听起来,除了一个比另一个更简洁之外,就我上面的例子而言,它们是。
  • 您将苹果与橙子进行比较。 !! 不是检查 值的替代方法,它旨在将值从一种类型更改 到另一种类型。那么,再次,您是在询问您的特定示例还是一般用例?
  • 不存在ab 的任何值,因此if(a&&b){return true}else{return false} 将永远产生不同的值return !!(a&&b)

标签: javascript boolean


【解决方案1】:

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

一个例子是,如果你正在观察一个表达式的变化(比如在 AngularJS 中):

$scope.$watch(() => val1 && val2, (newVal, oldVal) => { 
    //... 
});

如果val1undefined 开头,则val1 && val2 将评估为undefined。如果val1 稍后变为false,则val1 && val2 将评估为false。因此,当您可能不希望它执行时,您的观察者会再次执行!所以看!!(val1 && val2)可能会更好。

【讨论】:

  • 优秀的区别。我可以看到,在我的用例中,!!更健壮。
  • 这实际上发生在我身上。我有一个经过优化的 API,以便在将 C# 对象序列化为 JSON 时省略了 nullfalse 属性。因此,当它们到达浏览器时,属性为undefined。后来,当我在 JavaScript 中将其中一个 undefined 属性设置为 false 时,我的观察者执行了。
【解决方案2】:

是的,它们在功能上是等效的。 if 使用与 ! 运算符完全相同的 thruthiness 概念。然而,一个陈述是简洁的,另一个是无用的样板。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-05-27
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多