小议 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(/(^ ...
随机推荐
- Redis被攻击
记一次Redis被攻击的事件 最近几个月非常忙,所以很少有时间写博客,这几天终于闲了一些,于是就在整理平时的一些笔记.恰好这几天Redis服务器发生了问题,就记录一下. 我司有两款分别是2B和2C ...
- Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp
由<Lichee() 在sun4i_crane平台下的编译>介绍了编译lichee的基本情况,我们终于得到了编译后的结果例如以下: out/ ├── android │ ├── bIm ...
- SWTBOK实践测试系列(2) --您将提交测试开发者版本号打回来了?
开发商斗争非常多晚,提交测试的最终版本. 它们可以缓和.但噩耗传来很快,软件没有通过预测试测试团队(为了确保在测试过程,开发者提交的代码验证的基本功能或业务流程).开发王经理.快速找到负责预测试试验张 ...
- 减少iPhone手机系统版本号
要减少移动版本号,本号,或者到"威风"站点或其他能够下载到iPhone固件的站点上下载固件,然后打开iTunes,进入到 然后按着(alt),同一时候用鼠标点击(更新button) ...
- Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信
注:源码等等的我不会全然公开的,此篇文章写出来为大家的网络编程或者课程设计提供一定的思路.. 好,本次我们须要完毕的任务是: 完毕两台主机通过中间主机的数据通信(网络层) 添加基于IP地址的转发功能 ...
- M、V、C
概述 Model-View-Controller(MVC),即模型-视图-控制器. MVC将软件系统分成三大部分:Model,View,Controller,三个部分通过某种机制通信 M.V.C的职能 ...
- Json.Net6.0入门学习试水篇
原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...
- (大数据工程师学习路径)第四步 SQL基础课程----其他(基础练习到此为止)
一.准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. ...
- JavaScript 实现Map效果
var map = {}; // 类似:Map map = new HashMap(); map[key] = value; // 类似:map.put(key, value); var value ...
- CodeIgniter入门——HelloWorld
原文:CodeIgniter入门--HelloWorld CodeIgniter(CI)是一套给PHP网站开发者使用的应用程序开发框架和工具包. 初次接触,来一个HelloWorld~~~ ^_^ 准 ...