js中字符串的比较

这篇文章源于我三月底踩过的一个坑。

在撸前端业务代码的时候,经常会碰到这样的场景:在执行渲染前,判断是否在有效期,是否有资质(实际上就是有没有“考试”60分),如果满足的话,就渲染界面,让用户做业务,如果不满足,页面也不用渲染了,给用户一个温馨提示:抱歉,您的考试没有过60分,不能办理我们这个业务噢(哈哈哈,当然不是,会在更早渲染的时候,让客户找不到做这个业务的入口)

代码实际情况是什么样呢?

js中字符串的比较

没错,我理所当然的就这么写了,在我还是一个没有经验的菜鸟的情况下,我并没有觉得这有什么不妥

直到要上生产,最后一轮UAT客户测试的时候,某个执拗的客户,对着答案,硬生生做了一个100分的试卷,然后...居然没有渲染出来,我跟了跟断点,马上就发现问题了:

if(score>grade) 这里有问题,有什么问题呢?js中字符串的比较

一跟代码应该就能马上发现。字符串比较疏漏了,源头有两点:

1、我是个菜鸟

2、js让我太舒服了,var 一个变量,随便是啥类型都可以,想做比较 > < == 怎么写都不会报错,而且八九成都是对的

因为字符串比较会从第一个字符开始比较字符的ASCII码值,"100"的第一个字符"1","60"的第一个字符"6",一比较当然是false咯。改的办法其实很简单,if(score*1>grade) 就行了,原理是:score*1会把score由字符串类型整成number类型再比较js会把grade也整成number类型

痛定思过,再从头到尾梳理了一遍。

1、手动写score>60一般会没错,没人会无聊给60整成字符串的,但是不可能这样手动写,太蠢了,万一有个什么改动,就得全局搜一个个改吗?分数和资格这样的数据一定是存在数据库里的,支持配置每回调接口从数据库里查,然后再比较

2、发请求拿数据,数据传递九成九是json类型的,我司内部约定,调的接口出参是字符串类型,所以比较的时候就有可能会出现错误情况

3、比较的时候一定要留意类型类型类型!虽然有老大哥推荐我用 === 取代 == 但是用的多了 还是习惯== 因为偷懒吧,哈哈哈哈哈哈(不过要谨记,switch的case是===比较!)