小议 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(/(^ ...
随机推荐
- 它们的定义actionbar 并删除留空
通过他们自己的定义actionbar布局变化actionbar样式,简单而美丽.但有一个细节需要注意的是,高分辨率的问题留空.一般720上述决议,下一次你发现,无论什么样的变化总是会有一个小的布局文件 ...
- opencv-形态处理
开运算 (Opening) 原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/opening_closi ...
- Codeforces Round #107 (Div. 2)---A. Soft Drinking
Soft Drinking time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 实例教程Unity3D单例模式(一)通经常使使用方法
unity3d教程 中的单例模式通经常使使用方法 通经常使使用方法是在相关类增加GetInstance()的静态方法,检查实例是否存在.假设存在,则返回.假设不存在.则返回一个"须要用游戏元 ...
- harris 算法python实现
harris 最常用作特征检测算法. 第一个文件harris.py <pre name="code" class="python">from sci ...
- Facebook 网页应用图文设置教程
最近在弄一个项目,需要使用Facebook进行登陆并且获取用户Facebook相关的数据.网上查找有关Facebook应用设置教程,中文资料中,要么介绍的是N版之前的API,要么是App端的教程.Fa ...
- Cytoscape画图初探
Cytoscape是一个做网络图的js插件.用起来非常方便,并且非常强大.这是它的站点:点击打开链接 使用它须要导入两个文件,一个是js文件,一个是css文件.官网上下载. 这里实现了一个功能.即从后 ...
- seajs进行模块化开发
seajs进行模块化开发 模块化前端开发入门指南(二) 2015-08-26 15:23 by paseo, 370 阅读, 0 评论, 收藏, 编辑 概览 使用seajs模块化加载器进行模块化开发, ...
- ASP.NET农历时间显示(两)
在拍摄的月球时前(http://blog.csdn.net/yysyangyangyangshan/article/details/6802950),只是没有进行封装使用起来须要手动改动. 本次进行简 ...
- validform.js使用方法
表单验证之validform.js使用方法 一.validform有什么用? 网页上有大量的input需要你进行验证的时候,如果是弹窗的话,需要不停地判断,如果为空,弹窗.如果不是数字,弹窗. 所以要 ...