小议 js 下字符串比较大小
之前群里有人问如何比较两个时间大小,他的时间格式是 2014-08-08 而不是 2014-8-8。
所以我给的方法是 直接比较,如:
var a = "2014-08-08";
var b = "2014-09-09"; console.log(a>b, a<b); // false true
很方便不是么,但是原理是什么呢?
打开 ECMA 第 11.8.5 节 The Abstract Relational Comparison Algorithm
在 4. Else, both px and py are Strings 处可以看到字符串比较的情况。
或者翻开 V8 简单看下,在 COMPARE处,
if (IS_STRING(this)) {
if (IS_STRING(x)) return %_StringCompare(this, x);
if (IS_UNDEFINED(x)) return ncr;
left = this;
}
可以看到调用了 %_StringCompare,然后打开这个函数C++源码,(反正我是看不懂,就简单看看而已)
可以看到他一开始不知道比较什么东西,如果成立就相等,那函数我找到源码也没看懂什么意思,水平太水了,没办法。
直接如果字符串长度是的情况,就可以直接比较出大小。
最后才是关键,按每个字符的 charCode 大小进行比较,直到分出大小为止。
举个例子 a="", b=""; 那么执行 a > b 因为长度都是 ,所以在长度比较的时候就得到结果了。
如果 a="a11", b="a2"; 那么 a>b 会得到什么结果呢?
var a="a11", b="a2";
console.log(a>b, a<b);
如果有字符进行比较就不是比长度了,而是按字符逐个进行比较,知道分出大小为止。
a>b 比较,步骤是这样的:
1. a[0]=>"a", b[0]=>"a", 他们 charCode 相等,所以比较下一个。
2. a[1]=>"1", b[1]=>"2", charCode 是 , 是 ,所以 a[1] 小于 b[1]
差不多就重复这样的步骤进行对比,直到分出大小或者全部对比结束为止。
而不简单的比较字符串长度。
一句话概括就是按照字典序进行对比。
所以刚才的问题,如果日期格式合适的情况下,直接比较是最方便的啦。
说到这里,我想起心姐的一篇文章《从字典系排列算法证明选择大于努力》
console.log('选择'>'努力'); // true
因为 "选" 的 charCode 是 ,"努" 的 charCode 是
好了,今天的分享就这些了。
小议 js 下字符串比较大小的更多相关文章
- js判断字符串是否有下划线
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js:把字符串转为变量使用; js下将字符串当函数去执行的方法
1 把字符串当变量使用 通过计算 string 得到的值(如果有的话).该方法只接受原始字符串作为参数 demo: var type = "car"; var newStr = & ...
- JS判断字符串长度的5个方法
这篇文章主要介绍了JS判断字符串长度的5个方法,并且区分中文和英文,需要的朋友可以参考下 目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: 代码如下: String.pr ...
- node.js 下依赖Express 实现post 4种方式提交参数
上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...
- C# 字符串比较大小 string.Compare()方法
string.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 ...
- JS查找字符串中出现次数最多的字符
本文给大家带来两种js中查找字符串中出现次数最多的字符,在这两种方法中小编推荐使用第二种,对js查找字符串出现次数的相关知识感兴趣的朋友一起看看吧 在一个字符串中,如 'zhaochucichuz ...
- JS操作字符串
JS操作字符串 1.函数:split() 把字符串按分隔符分割成数组. 语法:字符串.split(separator,limit); separator:分隔符. 功能:使用一个指定的分隔符把一个字符 ...
- Python复杂场景下字符串处理相关问题与解决技巧
1.如何拆分含有多种分隔符的字符串¶ ''' 实际案例: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s=’ab;cd|efg|hi,jkl|mn\topq ...
- (网页)JS去掉字符串前后空格或去掉所有空格的用法(转)
转自脚本之家: 这篇文章主要介绍了JS去掉字符串前后空格或去掉所有空格的用法,需要的朋友可以参考下: 代码如下: function Trim(str) { return str.replace(/(^ ...
随机推荐
- JAVA设计模式--辛格尔顿
Singleton模式可以作为一种编程技术,让我们先从理论上说代码 单例模式三个关键点: 1).某个类仅仅能有一个实例 2).该类必须自行创建这个实例 3).该类必须自行向整个系统提供这个实例 应用场 ...
- 为什么在Python3.4.1里输入print 10000L或10000L失败
打开Python的命令行交互窗体,而且在里面进行以下的输入: Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:38:22) [MSC v.1600 ...
- Jeditable 点击编辑文字插件
Jeditable - jQuery就地编辑插件使用 jeditable是一个jquery插件,它的优点是可以就地编辑,并且提交到服务器处理,是一个不可多得的就地编辑插件.(注: 就地编辑,也有称 ...
- Nginx + IIS 配置,实现负载均衡
当你的Web应用程序访问量大的时候,一台服务器可能会因为压力过大而无法处理所有的请求.此时,可以增加服务器,采用负载均衡来分担所有的请求.关于Nginx的作用,自行百度了解.总之,在Windows平台 ...
- MVC5 Entity Framework学习之实现继承
之前你已经学习了怎样处理并发异常,在本节中你将学习怎样实现继承. 在面向对象的编程中,你能够使用继承来重用代码.接下来你将改动Instructor和Student类,让它们派生自Person基类,该基 ...
- 【转】Oracle Outline使用方法及注意事项
概要 Oracle Outline是用来保持SQL运行计划(execution plan)的一个工具. 我们能够通过outline工具防止SQL运行计划在数据库环境变更(如统计信息,部分參数等)而引 ...
- 怎么样CSDN Blog投机和增加流量?
所谓推测装置,以提高它们的可见性,最近比较顾得上,这样一来打字游戏.一方面,练习打字速度 .在又一个方面中,以了解诱导的理论 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL数据库管理
一.MySQL权限管理 账户权限信息被存储在mysql数据库的user.db.host.tables_priv.columns_priv和procs_priv表中. GRANT和REVOKE语句所用的 ...
- NET MVC
NET MVC 1.为 Action 标注 Attribute 限制访问 public class HomeController : Controller { [HttpPost] public Ac ...
- java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException
不是一个Exception,而是一个Error,要强制转成Exception类型,就出错了java.lang.NoClassDefFoundError java.lang.RuntimeExcepti ...