最近,我将项目中的null和undefined的统一了一下,将一部分场景下的变量,初始值值为undefined的,现在改成null。
改完之后,我发现了一个奇怪的bug,死活都定位不出来。代码从上到下走的逻辑都很正常,但是最后却抛出了一个不该抛出的异常。
于是我重新克隆了一份代码,并将其还原到没有修改null和undefined之前的状态。然后将修改前后的代码同时运行。我发现走到一个if分支的时候。改动之前的代码跳过了这一个分支,而改动之后的代码,则走进了这一个分支。这个if分支长下面这样:
const count = pageKidsCountCache.get(currentNode);
// Skip nodes where the page can't be.
if (count >= 0 && currentPageIndex + count <= pageIndex) {
currentPageIndex += count;
continue;
}
count从Map中取出来的值有时候会为空,在这种情况下,我将其改成null了。之后这个地方就出问题了。原本count>=0是false的。但是用null这么一改,就变成true了。进而带来了奇怪的问题。
我在chrome的控制台中输入了两遍,发现JavaScript确实是这样的。 null>=0的结果值为true,而undefined>=0的结果值为false。
为了进一步减轻自己的困惑。我查阅了一些资料。资料显示:
当使用关系运算符进行运算时,JavaScript 会将非数值的操作数转换为数字。null默认情况下会被转换成0,而undefined则会被转换为NaN。因为0>=0,所以null>=0是成立的,而NaN和任何一个数字比较,都是false,因此undefined>=0的值是false。