字符串总是逐个字符比较。
var bigger = "2017-01-01";
var smaller = "2000/01/01";
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
bigger = "2000-12-01";
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
当我们将此"2000-12-01" 与此"2000/01/01" 进行比较时,似乎它失败了。但是比较匹配前四个字符'2000',然后比较第五个"/" 和"-","-" 的 ASCII 值比"/" 低。
字符串比较必须逐个检查每个字符,直到发现差异。如果它没有发现任何差异,那么字符串是相同的。
一旦发现差异表明哪个字符串大于另一个。
示例:
字符串 1:"My dog howels"
字符串 2:"My dog barks"
代码检查每个字符,直到发现不同:
Position 0: "M" vs "M" - 相同
Position 1: "y" vs "y" - 相同
Position 2: " " vs " " - 相同
Position 3: "d" vs "d" - 相同
Position 4: "o" vs "o" - 相同
Position 5: "g" vs "g" - 相同
Position 6: " " vs " " - 相同
Position 7: "h" vs "b" - "h" 大于 "b"。
所以字符串 1 大于字符串 2。
与日期对象比较
如果你想比较日期,最好使用日期对象:
var bigger = Date.parse("2017-01-01");
var smaller = Date.parse("2000/01/01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
bigger = Date.parse("2000-12-01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
Date.parse() 会将您正确格式化的日期字符串转换为日期对象,然后比较日期的整数表示,给出准确的结果。
Date 对象将所有日期存储为数字,并且数字必须更快地进行比较。
比较没有日期对象
如果您不想使用日期对象,那么您需要去掉分隔符来仅比较数字。但是,如果您的日期对象并不总是两位数的月份和日期,这可能不起作用。
function fixDate(dateStr) {
return dateStr.replace(/[\/\-\s]/g, '');
}
var bigger = fixDate("2017-01-01");
var smaller = fixDate("2000/01/01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
bigger = fixDate("2000-12-01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);
带有正则表达式的replace 会删除字符串中的所有'-'、'/' 和空格。
所以'2018/01/11' 变成'20180111' 和'2000-05-01' 变成'20000501'。
只有在日期字符串格式正确的情况下,这两种方法才有效。