繁体   English   中英

为什么这组逻辑运算符可以正常工作?

[英]Why does this set of logical operators work correctly?

所以我在做一个难题来评估Kaprekar的例程,在第一部分中,我需要检查以确保4位输入至少有两个唯一数字,所以我这样做了:

let numArr = num.toString().split("");

if (numArr[0] == numArr[1] && numArr[2] && numArr[3]) {
  return 0;
}

我尝试搜索,但一直在寻找短路操作员的链接。 我期望将numArr [0] ==写出到每个&&块中,但令我惊讶的是它起作用了。 谁能解释为什么这对于3333返回0,但对于1234不返回0? 我假设numArr [2]和numArr [3]会自动评估为true。

有一种叫做运算符优先级的东西。 具有较高优先级的运算符首先发生。 ==发生在&&之前。 当有相同的优先级的多于一个运营商它的推移“关联”,其一般是左到右( =例如是从右到左); 让我们再来看一下您的代码

if ( ((numArr[0] == numArr[1]) && numArr[2]) && numArr[3] )

让我们只看第一部分。 进行3 == 3是正确的,并且由于所有运算符都不为0,因此if语句为true。 但是对于1234,1 == 2为假,因此表达式短路为假。 通常,当某些东西(如if语句)接受布尔值&&非零/未定义/ false值时,该表达式被视为true(我可能错了)。 如果您执行以下操作,则应该正确

if ( numArr[0] && numArr[1] && numArr[2] && numArr[3] )

为了回答您的另一个问题,通常当人们使用JS中的一组数据时,他们会使用lodash。 您可以通过行打击轻松找到是否有2个唯一值。 uniq(array,func)返回具有唯一顺序的唯一值的数组。 请参阅说明文件

_.uniq("3333".toString().split(""), v=>v).length >= 2 //false
_.uniq("1224".toString().split(""), v=>v).length >= 2 //true

这是因为对于字符串3333,num [0]为3,num [1] = 3,num [2] = 3,num [3] = 3

表达式基于运算符的优先级求值,并且当运算符具有相同的优先级时,它们从左到右执行

在这种情况下,==优先于&&,因此num [0] == num [1],它是3 == 3 true然后是true && num [2] && num [3] => true && 3 && 3 => true

对于字符串1234 num [0] = 1,num [1] = 2,num [2] = 3,num [3] = 4 num [0] == num [1],1 == 2为假,所以现在表达式为假&& num [2] && num [3]

对于&&运算符,如果第一个操作数为false,它将忽略表达式的其余部分,因此现在它的结果仅为false

希望这可以帮助

您正在评估三个表达式

// loose-equality, so true if after type-coersion, the values are equivalent
// this is the only condition that is actually changing in your code, unless
// you have a number with less than 4 digits
numArr[0] == numArr[1] 

// is a non-empty string so it's 'truthy'
numArr[2] 

// is a non-empty string so it's 'truthy'
numArr[3] 

任何非Falsy( false0""nullundefinedNaN )都是真实的

因此,您需要编写其他代码来检查唯一数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM