Javascript 布尔表达式-与AND、OR逻辑运算符混淆以及它们的工作方式
我必须把一个数字转换成逗号格式。例如12345=>12345 我有我的解决方案: function convert(n) { n = n.toString(); var result = ''; var count = 0, var idx = n.length - 1; while (r = n[idx]) { count++; result = ((count % 3 == 0 && count != n.length) ? ',' : '') + r + result; idx--; } return result; } 函数转换(n){ n=n.toString(); var结果=“”; 变量计数=0, var idx=n.长度-1; 而(r=n[idx]){ 计数++; 结果=((计数%3==0&&count!=n.length)',':'')+r+result; idx-; } 返回结果; } 但有人用过: result = ((count % 3 != 0 || count == n.length) ? '' : ',') + r + result; 结果=((计数%3!=0 | |计数==n.length)“:”,“)+r+结果;Javascript 布尔表达式-与AND、OR逻辑运算符混淆以及它们的工作方式,javascript,boolean-expression,Javascript,Boolean Expression,我必须把一个数字转换成逗号格式。例如12345=>12345 我有我的解决方案: function convert(n) { n = n.toString(); var result = ''; var count = 0, var idx = n.length - 1; while (r = n[idx]) { count++; result = ((count % 3 == 0 && count != n.length) ? ',' : '') + r
它们都有效,但现在我对自己的解决方案感到困惑,只是不明白它们为什么都有效。啊,我不知道我的问题是否清楚。这两个表达是等价的,第二个只是你的否定版本。==的对立面(或多或少)是!=,&&的对立面是| |,true的对立面是false 每当计数可被3整除且不在数字的开头时,就要放置逗号。每当计数不能被3整除或位于数字的开头时,它们都不会放置逗号。!(x和y)等于!x或!y (您可以通过双反运算从布尔x中提取NOT,例如: x==!!x 所以 x和!y(原始表达式)等价于!(!x或y)
如果从开头删除否定(!),那么实际上得到的是否定形式,这就是为什么在第二个示例中三元运算符的第二个和第三个值是相反的。假设,
count%3=0
和count>n.length
现在你的逻辑是:
((count % 3 == 0 && count != n.length) ? ',' : '')
这意味着True&&True
将导致True
,因此选择了之后的第一个
条件,即“,”
其他人的逻辑:
((count % 3 != 0 || count == n.length) ? '' : ',')
这意味着“False | | False”导致“False”,因此选择了“?
”之后的第二个
条件
注:两者都使用了相似的逻辑我现在理解了数学,但很难想象它们的等价性嗯,好吧。这里有一个例子。说x=“我要吃冰淇淋”和y=“我要吃蛋糕”,然后说x或y等于说“我要么吃蛋糕,要么吃冰淇淋,要么两者都吃。”因此!(x或y)等于说“我不吃蛋糕,也不吃冰激凌,或者两者都不吃。”换句话说,“我不吃蛋糕,也不吃冰激凌”或者用布尔逻辑!x和!y希望这是一个清楚的例子(尽管不是证明)!x和!y等同于!(x或y)。