js中的大小比较

各种数据的比较在日常工作中见的多的不能再多,可是有时候仍然会犯一些错误。这些错误在大多数情况下并不会出现,甚至运转相当正常,可是碰到一些也是常见但是考虑不到的情况时,我们会很纠结一段子,因为前面运行的很好,逻辑也是正确的,怎么知道到底哪儿出了错。。。
正是由于这种“逻辑正确”的想法,让我们在日常工作中忽略了相当一部分的问题:类型不一致。今天碰到的问题是,在js中查询出了某个单子两个工作节点里人员的数量,当前面某一设定为2的时候,在approve这个节点需要所有人都在才能进行approve 操作。但是当上载人名单总共19个人,其他节点有10个,当前节点有九个时,点击approve竟然能直接通过而没有触发校验!逻辑上讲,19>9,肯定不会有问题啊,那么原因出在那里呢?
仔细观察发现,我们给存储19和9这两个值的变量赋值的时候,是使用数据库查询出的结果集取出后直接赋值,而js中存储数据库查询结果的时候,只有特殊字段,其余字段,如数字和字符串,全部使用的字符串存储。于是乎我们这两个字段也都是用字符串存储的19和9.即,比较时实际上比较的是’19’>’9’,在字符串的比较中,是按字符比较,那么首先比较的是’1’与’9’的大小。于是。。。’19’>’9’这个比较的结果是false而不是true!
出现这种现象的原因并不是说多么高深的问题,其实只是我们日常工作习惯得问题。一般情况下,用字符串存储数字需要比较大小时,最好的方式还是转化成数字。不只是js,数据库中也有很多数字是用字符串来存储的情况,这时候的操作就需要我们尤其小心。否则,就真是南辕北辙了。
解决方式:假设以上两个变量用a和b来进行存储,那么在比较之前,写上如下两个语句:
a = a * 1;
b = b* 1;
这两句看起来毫不起眼,但是将原来的String a和String b全都转化成了 number a 和 number b,这样19与9的比较必然不会出现问题!
细节是魔鬼啊!