自己实现string的substring方法 人民币小写转大写,数字反转,正则优化


Posted in Javascript onSeptember 02, 2012

水平有限,不保证我的方案绝对正确,如有错误欢迎指出。

一、自己实现string的substring方法

方法一:用charAt取出截取部分

String.prototype.mysubstring=function(beginIndex,endIndex){ 
var str=this, 
newArr=[]; 
if(!endIndex){ 
endIndex=str.length; 
} 
for(var i=beginIndex;i<endIndex;i++){ 
newArr.push(str.charAt(i)); 
} 
return newArr.join(""); 
} //test 
"Hello world!".mysubstring(3);//"lo world!" 
"Hello world!".mysubstring(3,7);//"lo w"

方法二:把字符串转换成数组然后取出需要部分
String.prototype.mysubstring=function(beginIndex,endIndex){ 
var str=this, 
strArr=str.split(""); 
if(!endIndex){ 
endIndex=str.length; 
} 
return strArr.slice(beginIndex,endIndex).join(""); 
} //test 
console.log("Hello world!".mysubstring(3));//"lo world!" 
console.log("Hello world!".mysubstring(3,7));//"lo w"

方法三:取出头尾部分,然后用replace去掉多余部分,适用于beginIndex较小,字符串长度-endIndex较小的情况
String.prototype.mysubstring=function(beginIndex,endIndex){ 
var str=this, 
beginArr=[], 
endArr=[]; 
if(!endIndex){ 
endIndex=str.length; 
} 
for(var i=0;i<beginIndex;i++){ 
beginArr.push(str.charAt(i)); 
} 
for(var i=endIndex;i<str.length;i++){ 
endArr.push(str.charAt(i)); 
} 
return str.replace(beginArr.join(""),"").replace(endArr.join(""),""); 
} //test 
console.log("Hello world!".mysubstring(3));//"lo world!" 
console.log("Hello world!".mysubstring(3,7));//"lo w"

二、一万亿以内的人民币小写转大写,暂不考虑连续零的处理
方法一(七行代码实现):
function moneyCaseConvert(num){ 
var upperArr=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"], 
levelArr=["","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万"], 
numArr=num.toString().split("").reverse(), 
result=[]; 
for(var i=numArr.length-1;i>=0;i--) 
result.push(upperArr[numArr[i]]+levelArr[i]); 
return result.join(""); 
} //Test 
console.log(CaseConversion(1234567891234)); 
//壹万贰仟叁佰肆拾伍亿陆仟柒佰捌拾玖万壹仟贰佰叁拾肆 
console.log(CaseConversion(987654321)); 
//玖亿捌仟柒佰陆拾伍万肆仟叁佰贰拾壹 
console.log(CaseConversion(1234)); 
//壹仟贰佰叁拾肆

三、数字反转,输入123返回321
方法一:
function numReverse(num){ 
return parseInt(num.toString().split("").reverse().join("")); 
} 
//Test 
console.log(numReverse(123456)); 
//654321

方法二:
function numReverse(num){ 
var numArr=num.toString().split(""), 
len=numArr.length, 
result=0; 
for(var i=len-1;i>=0;i--){ 
result+=numArr[i]*Math.pow(10,i); 
} 
return result; 
} //Test 
console.log(numReverse(123456)); 
//654321

四、JSONP原理,与Ajax的关系

JSONP原理是利用了script标签动态解析JS的特性,通过动态添加<script>标签来调用服务器提供的js脚本,达到跨域调用的目地。关于JSONP更多信息可以参考这篇文章:https://3water.com/article/31167.htm。

JSONP与AJAX看起来有点像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,但JSONP与AJAX是两个不同的东西,这两者之间可以说没什么关系。

五、正则表达式优化

正则表达式的优化总的来说就是尽可能精确,减少回溯次数,具体来说主要是以下几点:

1.如果你的正则工具支持,在不需要引用括号内文本的时候使用非捕获型括号:(?:expression) 。
2.如果括号是非必须的,请不要加括号。
3.不要滥用字符数组,比如[.],请直接用\. 。
4.使用锚点^ $ ,这会加速定位。
5.从两次中提取必须元素,如:x+写成xx*,a{2,4}写成aa{0,2}。
6.提取多选结构开头的相同字符,如the|this 改成th(?:e|is)。(如果你的正则引擎不支持这么使用就改成th(e|is));尤其是锚点,一定要独立出来,这样很多正则编译器会根据锚点进行特别的优化: ^123|^abc 改成^(?:123|abc)。同样的$也尽量独立出来。
7.多选结构后边的一个表达式放入多选结构内,这样能够在匹配任何一个多选结构的时候在不退出多选结构的状态下查看后一匹配,匹配失败的更快。这种优化需要谨慎使用。
8.忽略优先匹配和优先匹配需要你视情况而定。如果你不确定,请使用匹配优先,它的速度是比忽略优先快的。
9.拆分较大正则表达式成一个个小的正则表达式,这是非常有利于提高效率的。
10.模拟锚点,使用合适的环视结构来预测合适的开始匹配位置,如匹配十二个月份,可以先预查首字符是否匹配:(?=JFMASOND)(?:Jan|Feb|…|Dec)。这种优化请根据实际情况使用,有时候环视结构开销可能更大。

注:以上几点节选自https://3water.com/article/31168.htm,非常好的一篇正则表达式优化文章,推荐有兴趣的朋友看原文。

六、visibility:hidden与 display:none 的区别

区别主要有三点:

1、空间占据:元素设置为visibility:hidden后仍然占据物理空间,而元素设置为display:none后是不占据空间的。

2、性能:visibility:hidden因为仍然占据物理空间,所以不会引起页面的回流和重绘,所以性能更好,反之display:none会引起页面回流和重绘。

3、继承性:当父元素设置为display:none后所有子元素均会被引藏,不改变父元素可见性的情况下子元素没有办法显示出来,如果父元素设置为visibility:hidden,所有子元素也会不可见,但如果给子元素设置为visibility:visible的话,子元素就可以重见天日了。

七、篇历DOM树

方法一:用nextSibling和childNodes

function traversalByNextSibling(obj){ 
var ch=obj.firstChild, 
result=[]; 
do{ 
result.push(ch.nodeName); 
if(ch.childNodes.length){ 
result.push.apply(result,traversalByNextSibling(ch)); 
} 
}while(ch=ch.nextSibling); 
return result; 
}

方法二:用childNodes
function traversalByChildNodes(obj){ 
var ch=obj.childNodes, 
result=[]; 
for(var i=0,j=ch.length;i<j;i++){ 
result.push(ch[i].nodeName); 
if(ch[i].childNodes.length){ 
result.push.apply(result,traversalByChildNodes(ch[i])); 
} 
} 
return result; 
}

测试:
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Demo</title> 
<style type="text/css"> </style> 
</head> 
<body> 
<div id="test">Test</div> 
<div>Hello World</div> 
<p>PTest</p> 
<script> 
console.log(traversalByNextSibling(document)); 
//IE6-8: #comment,HTML,HEAD,TITLE,META,STYLE,BODY,DIV,#text,DIV,#text,P,#text,SCRIPT 
//other:["html", "HTML", "HEAD", "#text", "META", "#text", "TITLE", "#text", "#text", "STYLE", "#text", "#text", "#text", "BODY", "#text", "DIV", "#text", "#text", "DIV", "#text", "#text", "P", "#text", "#text", "SCRIPT", "#text"] 
console.log(traversalByChildNodes(document)); 
//IE6-8: #comment,HTML,HEAD,TITLE,META,STYLE,BODY,DIV,#text,DIV,#text,P,#text,SCRIPT 
//otehr:["html", "HTML", "HEAD", "#text", "META", "#text", "TITLE", "#text", "#text", "STYLE", "#text", "#text", "#text", "BODY", "#text", "DIV", "#text", "#text", "DIV", "#text", "#text", "P", "#text", "#text", "SCRIPT", "#text"] 
</script> 
</body> 
</html>

在IE6-8中把换行去掉了,在其他浏览器中把换行作为一个文本节点,所以会有很多#text,但IE6-8中出现了#comment我现在也没明白为什么。
Javascript 相关文章推荐
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 Javascript
jQuery右下角旋转环状菜单特效代码
Aug 10 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
Jan 04 Javascript
常见的浏览器Hack技巧整理
Jun 29 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
Oct 02 Javascript
es6 filter() 数组过滤方法总结
Apr 03 Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
javascript实现前端分页效果
Jun 24 Javascript
如何利用JavaScript编写更好的条件语句详解
Aug 10 Javascript
Javascript中的delete介绍
Sep 02 #Javascript
JS判断当前日期是否大于某个日期的实现代码
Sep 02 #Javascript
Javascript this 的一些学习总结
Aug 31 #Javascript
javascript动画浅析
Aug 30 #Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 #Javascript
JS跨域代码片段
Aug 30 #Javascript
JS跨域总结
Aug 30 #Javascript
You might like
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python多项式回归的实现方法
2019/03/11 Python
pandas中ix的使用详细讲解
2020/03/09 Python
django 外键创建注意事项说明
2020/05/20 Python
python实现粒子群算法
2020/10/15 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Python实现区域填充的示例代码
2021/02/03 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
初中军训感想300字
2014/03/05 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
经典团队口号大全
2014/06/21 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
好人好事演讲稿
2014/09/01 职场文书
公司员工培训管理制度
2015/08/04 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
Pandas自定义选项option设置
2021/07/25 Python