【问题标题】:JavaScript syntax advice: Invalid left hand side in prefix expression when auto formattingJavaScript 语法建议:自动格式化时前缀表达式的左侧无效
【发布时间】:2021-02-13 16:22:36
【问题描述】:

我继承了一个代码库,也就是“遗留代码”,我非常小心不要破坏任何东西。我在自动格式化时偶然发现了一个错误。

该函数的目的是对图表进行排序。我评论了我不明白的部分:

function sortChartBy(field,dir=1) {
    if(g_sortMethod != field){
        g_sortDir = 1;
    }
    g_sortMethod = field;
    g_sortDir = g_sortDir * -1 * dir;
    
    var ranks = g_chart["ranks"];
    var sortMethod = g_sortMethod;
    var sortDir = g_sortDir;
    
    var sortFunc = undefined;
    if(field == "release_date"){
        sortFunc = function(a,b){
            var aVal = a[sortMethod];
            var bVal = b[sortMethod];
            if(aVal == "1970-01-01") aVal = "9999--99-99";
            if(bVal == "1970-01-01") bVal = "9999-99-99";
            if(aVal < bVal) return -1 * sortDir;
            if(aVal > bVal) return  1 * sortDir;
            return 0;
        };
    }else{
        sortFunc = function(a,b){
      var aVal = a[sortMethod];
      var bVal = b[sortMethod];

      // ###### QUESTION HERE ########################################
      if (aVal == -1 && bVal !=- -1) return 1; 
      // 'bVal !=- -1' What does that mean? Why '-' directly after '!='

      if (aVal != -1 && bVal == -1) return -1;
      if (aVal < bVal) return -1 * sortDir;
      if (aVal > bVal) return  1 * sortDir;
      return 0;
        };
    }
    
    ranks.sort(sortFunc);
    renderChart();
}

我使用 IntelliJ 作为 IDE。当我使用自动格式时,“!=”后的“-”减号将一个字符向右移动一个字符,将行显示为

if (aVal == -1 && bVal != --1) return 1; // Invalid left hand side in prefix expression

现在 Intellij 显示错误声明 Invalid left hand side in prefix expression 并用红色错误下划线标记“1”。

我不明白为什么原始代码中有两个用空格!=- -1 分隔的减号以及为什么 Intellij 将其格式化为错误。该代码似乎在原始代码中运行良好。我从未在 JavaScript 中见过 !=-。对我来说,这似乎是无效的。

请解释为什么if (aVal == -1 &amp;&amp; bVal !=- -1) return 1; 行似乎可以正常工作,但随后会自动格式化为错误。

正确的代码应该是什么样的?

【问题讨论】:

  • 不知道他们为什么这样做,但console.log(- -1)
  • 这基本上是一个错字。 --1 是无效代码,因为它尝试在文字 (1) 上使用前缀递减运算符 (--)。前缀递减运算符的工作是递减存储在变量或属性中的值;它写回它减少的内容。你不能写回文字。该代码应该只是-1
  • @T.J.Crowder 感谢您的及时回复。请把它写成答案,以便我接受。
  • 通过 prettier 运行它并将其格式化为:if (aVal == -1 &amp;&amp; bVal != -(-1)) return 1; 也许编写一个带有预期输入和函数输出的测试,以确保您的更改不会破坏任何东西:)
  • 我们不会在 SO 上发布“这是一个错字”的答案,我们只是关闭问题。但现在我真的有兴趣了解解析的代码。

标签: javascript syntax operators legacy-code


【解决方案1】:

请解释为什么if (aVal == -1 &amp;&amp; bVal !=- -1) return 1; 行似乎可以正常工作,但随后会自动格式化为错误。

格式化程序确实破坏了该代码,但我怀疑它已经被破坏了。 :-) 但是格式化程序违反了一个基本原则:它正在改变代码的含义(在这种情况下,从有效但可能错误的语法到无效的语法 :-D )。

感谢Mellet mentioned 通过不同的格式化程序运行它,我午后昏昏欲睡的大脑理解了原始解析的原因:它是一元- 运算符被使用了两次。

所以代码是!= - -1,即!= -(-1),即!= 1

但这可能是一个错字,并且检查可能应该针对-1,而不是1

【讨论】:

  • 感谢您的解释。我测试了-11。在这两种情况下,排序都正确完成。我现在使用bVal != 1。为了以防万一,我在原始代码中添加了注释。
  • @EliteRaceElephant - 排序回调代码比它需要的复杂得多。如果aValbVal 是数字,则实际上回调可以是return (a[sortMethod] - b[sortMethod]) * sortDir;,假设sortDir1 用于升序排序,-1 用于降序排序。同样,前面的回调比较日期字符串可以简单地将returns 的最后三行替换为:return aVal.localeCompare(bVal) * sortDir;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2018-10-08
  • 2016-11-24
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多