JavaScript语法建议:自动格式化时前缀表达式的左侧无效
我继承了一个代码库,也就是“遗留代码”,我非常小心不要破坏任何东西。我在自动格式化时偶然发现一个错误 该函数的目的是对图表进行排序。我评论了我不理解的部分:JavaScript语法建议:自动格式化时前缀表达式的左侧无效,javascript,syntax,operators,legacy-code,Javascript,Syntax,Operators,Legacy Code,我继承了一个代码库,也就是“遗留代码”,我非常小心不要破坏任何东西。我在自动格式化时偶然发现一个错误 该函数的目的是对图表进行排序。我评论了我不理解的部分: function sortChartBy(field,dir=1) { if(g_sortMethod != field){ g_sortDir = 1; } g_sortMethod = field; g_sortDir = g_sortDir * -1 * dir; va
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显示一个错误,说明前缀表达式中的左侧无效,并用红色错误下划线标记“1”
我不明白为什么有两个负号用空格隔开!=--1
在原始代码中,以及Intellij将其格式化为错误的原因。该代码在原始代码中似乎运行良好。我从未见过=-代码>在JavaScript中。对我来说,这似乎是无效的
请解释为什么行if(aVal==-1&&bVal!=-1)返回1代码>似乎工作正常,但随后自动格式化为错误
正确的代码应该是什么样子
请解释为什么行if(aVal==-1&&bVal!=-1)返回1代码>似乎工作正常,但随后自动格式化为错误
格式化程序确实正在破坏该代码,但我怀疑它已经被破坏了。:-)但是格式化程序违反了一个基本原则:它改变了代码的含义(在本例中,从有效但可能错误的语法到无效语法:-D)
多亏通过一个不同的格式化程序运行它,我午后昏昏欲睡的大脑理解了原始解析的原因:一元-
运算符被使用了两次
所以代码是!=--1
哪个是!=-(-1)
哪个是!=1
但这可能是一个输入错误,检查可能是针对-1
,而不是1
不确定他们为什么这样做,但console.log(--1)
这基本上是一个输入错误--1
是无效代码,因为它试图对文本(1
)使用前缀减量运算符(--
)。前缀递减运算符的工作是递减存储在变量或属性中的值;它写回它递减的值。你不能写回文字。代码应该是-1
@T.J.Crowder谢谢您的及时回复。请把它写成一个答案,这样我就可以接受了。在prettier中运行它并将其格式化为:if(aVal==-1&&bVal!=-1))返回1代码>也许用函数的预期输入和输出编写一个测试,以确保您的更改不会破坏任何内容:)我们不会发布“it's a typo”答案,因此,我们只需关闭问题。但是现在我真的很想理解解析代码。谢谢你的解释。我测试了-1
和1
。在这两种情况下,排序都正确完成。我使用bVal!=1现在。我用原始代码添加了一条注释,以防万一。@EliteRaceElephant-排序回调代码比它需要的复杂得多。如果aVal
和bVal
是数字,则回调可以是return(a[sortMethod]-b[sortMethod])*sortDir
假设对于升序排序,sortDir
为1
,对于降序排序,-1
。类似地,前面比较日期字符串的回调可以将return
s的最后三行替换为:return aVal.localeCompare(bVal)*sortDir代码>。
if (aVal == -1 && bVal != --1) return 1; // Invalid left hand side in prefix expression