布尔表达式 - 与 AND、OR 逻辑运算符混淆以及它们的工作原理

Boolean expressions - getting mixed up with AND, OR logical operators and how they work

我必须将数字转换为逗号格式。例如 12345 => 12,345.

我有我的解决方案:

函数转换(n){
  n = n.toString();
  变种结果='';
  变量计数 = 0,
  var idx = n.length - 1;

  while (r = n[idx]) {
    计数++;
    结果 = ((count % 3 == 0 && count != n.length) ? ',' : '') + r + 结果;
    idx--;
  }
  return 结果;
}

但是别人用过:

    结果 = ((count % 3 != 0 || count == n.length) ? '' : ',') + r + 结果;

它们都有效,但现在我对自己的解决方案感到困惑,并且不知道为什么它们都有效。啊不知道我的问题是否清楚

这两个表达式是等价的,第二个只是你的否定版本。 ==的反义词(或多或少)是!=,&&的反义词是||,true的反义词是false。

只要计数可以被 3 整除并且您不在数字的开头,您就在放置逗号。他们不会在计数不能被 3 整除或位于数字开头时放置逗号。

!(x AND y) 等于 !x OR !y

(并且您可以通过双重否定从布尔值 x 中提取 NOT,例如:

x == !!x

所以

x AND !y(您的原始表达式)等同于 !(!x OR y)

如果你从一开始就删除了否定 (!),那么你实际上得到了 Negated 形式,这就是为什么在你的第二个例子中三元运算符的第二个和第三个值是相反的。

假设 count % 3 = 0count > n.length

现在你的逻辑是:

((count % 3 == 0 && count != n.length) ? ',' : '')

这意味着 True && True 结果是 True 因此 ? 之后的 first 条件是“,”被选中。

别人的逻辑:

((count % 3 != 0 || count == n.length) ? '' : ',')

这意味着 'False || False' 结果是 'False' 因此 second? 之后的条件是“,”被选中。

P.S: 两者使用相似的逻辑