a>b的那些事

前言

经常会遇到对比两个值大小关系的逻辑,常规的处理中我们都是处理两个数字或者数字类型的字符串。那么这里进行延伸拓展的练习,来避免一些开发中的采坑。

起因

起因是自己在看《vuejs权威指南》里看到表单验证里,也就是validator.js里可以验证最小最大值的源码部分。

源码里针对最小值的写法是这样的:

export default  min (val, areg){
return !isNaN(val) && !isNaN(areg) && +(val)>= +(areg)
}

在上面的代码里我们可以看到严谨的判断了,两个比较类型均是可以转为数字类型的判断。然后第三个判断就有点不是很理解了,两个都加加号是什么操作?

基础回顾

我们知道+操作符除了一些基本的数字的运算,还支持一些其他的功能。

1 前面为数字,后面为数字的字符串,两者相加,会得到字符串的相加。

let a = 1 , b ='2'
let c = a + b
console.log(c) //12

2 如果两者都是字符串,那么得到是字符串的相加,也就是我们之前es5最熟悉的字符串拼接方式。

额外发现

  • 支持数字型的字符串类型的转换,我们用typeof方法去判断+b的数据类型时,发现已经转变为了Number类型
let a = 1 , b ='2'
let c = a + +(b)
console.log(c) //3 ,
  • 那么既然加法不支持数字类型与字符串的运算,减法是否支持呢?

通过代码尝试,我们发现无论是数字减去字符串型的数字,还是字符串型的数字互相减,都是可以得到想要的结果,而不是和加法一样会有时去按照拼接字符串处理。

let a = "2" ,b= '20',c=34 ,d='2'

document.write(a - b)
document.write(c - d)
document.write(b - c)
  • 进一步,我们尝试用减法是否可以改变数据的类型。

结果表明,-(a)操作也是可以改为数据类型的字符串改为数字的。但是其中是有一个潜在的问题的,就是-在转换的时候,如果值为负数,转换得到的是其相反数,这个不是我们期望的。

所以从这点在回看,用+做数字或者非数字的不区分转换是比较ok的。

用>判断大小是否合理

用> 判断两个确定为数字的没有任何问题,等效于数学意义的比较

用于比较数字和非数字是否合理

比如我们经常举例的,’20’ > ‘100’,其返回的结果是true,明显不符合预期,所以我们比较大小的时候多数这样写的:a-b>0,这样比较大小没有问题。

>如果比较两个字符串比较的是什么

其比较的内容是 :按字符在unicode中的码位来比较大小。所以一般情况下比较两个字符窜的大小么有实际可用的意义。

总结

通过本文我们看到了比较两个类数字的严谨的方式方法,也知道了+运算符可以没有难度的帮我们把数字型的字符串转为数字类型;如果你不习惯这样比较,也可以用a-b的减法操作进行。

彩蛋

延伸与拓展

在array的sort方法中,相信你还记得起比较大小顺序的语法是这样的。这里不是用a>b比较的,因为直接用大于无法比较出真正想要的大小,所以一般是a-b。

arr.sort((a, b ) =>{
return a-b 
})

isNaN的拓展

既然提到了NaN,我们顺便回忆下,哪些类型是我们容易遗漏的NaN类型。

  • 以下常见的类型或者值都是NaN类型哦,返回为true. 空对象,undefined,NaN,字符,字母等,日期的字符串形式等。
  • 而以下则会转成数字,返回false. 比如布尔型的true,false,新建日期,空字符串,null,空数组

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

排序----堆排序

17000
来自专栏前端黑板报

一个数字截取引发的精度问题(三)

上次总结的第四条: 当传入的参数小于数字的整数位时,返回指数形式表示的字符串。 let numObj = 12345.6numObj.toPrecision(2...

20880
来自专栏PHP实战技术

解构赋值,你不能不懂!

150100
来自专栏Vamei实验室

Python基础09 面向对象的进一步拓展

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数。这个参数表示某个...

20470
来自专栏CDA数据分析师

Python面试中8个必考问题

1、下面这段代码的输出结果是什么?请解释。 ? 怎样修改extendList的定义能够产生以下预期的行为? 上面代码输出结果将是: ? 很多人都会误认为list...

205100
来自专栏韦弦的偶尔分享

Swift 最长公共前缀 - LeetCode

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

13030
来自专栏keyWords

JavaScript之作用域和闭包

9010
来自专栏技术小站

(String)、toString、String.valueOf用法区别(转)

在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。

12420
来自专栏坚毅的PHP

python的数学函数(1)-python组合函数模块itertools

要解决的问题: 输出n个 ['A','T','C','G'] 所有的排列组合。 比如n=2 时,输出为 AA,AT,AC,AG,TA,TT,TC,TG,……...

40140
来自专栏前端黑板报

一个数字截取引发的精度问题(二)

上篇文章只是简单介绍了Number的 toFixed 方法,周末抽时间把 Number 里的一些方法又看了一下,其中有个方法引起我的注意: Number.pro...

20260

扫码关注云+社区

领取腾讯云代金券