javascript逻辑运算符&&不工作

时间:2017-04-30 09:09:18

标签: javascript angularjs

您好我正在使用angularjs调用绑定到html元素的函数。此函数包含一个简单的if语句,用于计算意外结果。

scope.submit=function(){
  var reqFirstDate = dateFilter(scope.date.first, scope.df);
  var reqSecondDate = dateFilter(scope.date.second, scope.df);
  var reqThirdDate = dateFilter(scope.date.third, scope.df);
  console.log("First :"+ reqFirstDate >= dateFilter(scope.minDat, scope.df)); // prints: true
  console.log("Second: "+ reqSecondDate >= dateFilter(scope.minDat, scope.df));// prints: true
  console.log("Third :" + reqThirdDate >= dateFilter(scope.minDat, scope.df));// prints : true
  console.log("Final condition: "+reqFirstDate >= dateFilter(scope.minDat, scope.df) && reqSecondDate >= dateFilter(scope.minDat, scope.df) && reqThirdDate >= dateFilter(scope.minDat, scope.df)); // prints: false
  if (reqFirstDate >= dateFilter(scope.minDat, scope.df) && reqSecondDate >= dateFilter(scope.minDat, scope.df) && reqThirdDate >= dateFilter(scope.minDat, scope.df)) { 
   //doSomething 
  }               
}

最终条件评估为假。这怎么可能?

1 个答案:

答案 0 :(得分:1)

加号运算符+的优先级高于>=所以此表达式(例如)

"First :"+ reqFirstDate >= dateFilter(scope.minDat, scope.df)

被评估为好像是写的

( "First :"+ reqFirstDate ) >= dateFilter(scope.minDat, scope.df)

显然不是故意的。

正确使用括号可以解决此问题:

"First :"+ ( reqFirstDate >= dateFilter(scope.minDat, scope.df) )

您的代码需要相应修改console.log行:

console.log("First :" + ( reqFirstDate >= dateFilter(scope.minDat, scope.df ) ) );
console.log("Second: "+ ( reqSecondDate >= dateFilter(scope.minDat, scope.df) ) );
console.log("Third :" + ( reqThirdDate >= dateFilter(scope.minDat, scope.df ) ) );
console.log("Final condition: " + ( reqFirstDate >= dateFilter(scope.minDat, scope.df) && reqSecondDate >= dateFilter(scope.minDat, scope.df) && reqThirdDate >= dateFilter(scope.minDat, scope.df) ) );

请注意,需要在if表达式中添加额外的括号,因为那里没有任何歧义:>=&&之前进行评估。

如果您认为代码更易读或您不确定运算符优先级,那么可以添加它们。我认为这不是这种情况。

有关运营商及其优先顺序的完整列表,请参阅 Javascript Operators Precedence

更高的优先级意味着首先计算表达式部分。

下注:

正如其他人指出的那样,您可以利用,中的逗号console.log打印出值或(如您的情况)标签/变量名称和相应的值。

console.log( 'label:', true );

console.log( 'a>b', a>b );