原来博客园也支持markdown,呜呜呜,才知道。
r1 js字符串和数字的比较 (简书)
比较分为很多种,大致常见的参赛选手有三类:数字、数字字符串和字符串
数字 | 数字字符串 | 字符串 | |
---|---|---|---|
数字 | 常规比较 | 1.转换比较 | 2.按位转换比较 |
数字字符串 | —— | 3.按位转换比较 | 4.按位转换比较 |
字符串 | —— | —— | 5.按位转换比较 |
首先,先总结一句话:有数字参与比较会将对手转化为数字再比较;字符串之间的比较都是按位(逐位)比较,并通过ASCII码比较,可以把数字字符串归为字符串一类。
其次,应用:
-
比较两个时间的大小
('2018-12-12'<'2018-12-13') //=> true,很常见吧 // 再也不用转为时间戳比较了,呜呜呜
再看下面例子,加深理解:
// 1.数字vs数字字符串
(5<'10') //=> true,发现会将'10'转化为10进行比较
// 2.数字vs字符串
(5<'a') //=> false,永远为false,因为与数字进行比较,
// 她首先会进行转换成数字,而'a'转为数字是NaN
// 与NaN比较无意义,自然永远为false
// 小结:从1、2两个例子可以看出,只要跟数字比较,
// 她都会尝试将待比目标转化为数字
// 3.数字字符串vs数字字符串
('5'<'10') //=> false,会发现她是按位比较,并且比较的是ASCII
'5'.charCodeAt(0) //=> 53
'1'.charCodeAt(0) //=> 49
// 0-9的ASCII码为48-57
// 4.数字字符串vs字符串
('111111111111'<'a') //=> false,无论前面是多少个1,结果都为false
// 因为比较时,按位比较,且数字1的ASCII小于a
// 扩展:所有数字都小于字母的ASCII
// 5.字符串vs字符串
('a'<'b') //=> true,这个和第3、4点结论一致,都是按位并转化为ASCII比较
// 小结:通过3、4、5三个例子发现,只要是字符串之间的比较都是
// 按位+ASCII码比较
// 6.最后看一下逐位比较
('abc'<'abcd') //=> true,人家多一个d,当然比不过
('abcc'<'abcd') //=> true,人家d>c(ASCII码),当然比不过
('2018-12-12'<'2018-12-13') //=> true,很常见吧