都是基于String.prototype的扩展:
起因是有个网友和我讨论两个函数,
一个是isDateTime(判断字符是否是符合yyyy-mm-ddhh:mm:ss日期格式)
另一个是left函数,类似vbscript的left实现中英文字符的混合截取。
他两个函数都用了循环,还用了N多if语句,每个函数都超过了40行代码,问我有无好的办法精简一下。
于是,我就写出了下面的代码,不敢说最效率最高,但是已经是够精简了,left函数才1行
复制代码 代码如下:
1<scripttype="text/javascript">
2
3//byGo_Rush(阿舜)fromhttp://ashun.cnblogs.com/
4
5function$A(arrayLike){
6for(vari=0,ret=[];i<arrayLike.length;i++)ret.push(arrayLike[i])
7returnret
8};
9Array.prototype.any=function(f){
10for(vari=0;i<this.length;i++)if(f(this[i],i,this))returntrue;
11returnfalse
12};
13
14
15
16//判断字符串是否符合yyyy-mm-ddhh:mm:ss的日期格式,格式正确而且闰年闰月等也要正确
17
18String.prototype.isDateTime=function(){
19try{
20vararr=(this.length==19)?this.split(/D/):[]
21--arr[1]
22eval("vard=newDate("+arr.join(",")+")")
23returnNumber(arr[0])==d.getFullYear()&&Number(arr[1])==d.getMonth()
24&&Number(arr[2])==d.getDate()&&Number(arr[3])==d.getHours()
25&&Number(arr[4])==d.getMinutes()&&Number(arr[5])==d.getSeconds()
26}catch(x){returnfalse}
27}
28
29/*
30alert("2002-12-1210:10:40".isDateTime())//true
31alert("2002-02-3110:10:40".isDateTime())//false
32alert("2002-22-3110:10:40".isDateTime())//false
33alert("2002-22-3130:10:40".isDateTime())//false
34*/
35
36
37//检查是否以特定的字符串结束
38String.prototype.startsWith=function(){
39var_string=this
40return$A(arguments).any(function(value){return_string.slice(0,value.length)==value})
41};
42/*
43alert("http://www.google.com/".startsWith("http://","ftp://","telnet://"))//true满足其中任何一个就返回true
44alert("http://www.google.com/".startsWith("https://","file://"))//false
45alert("abc".startsWith("a"))//true
46*/
47
48
49//检查是否以特定的字符串结束
50String.prototype.endsWith=function(){
51var_string=this
52return$A(arguments).any(function(value){return_string.slice(value.length*(-1))==value})
53};
54
55
56
57//从左边截取n个字符,如果包含汉字,则汉字按两个字符计算
58String.prototype.left=function(n){
59returnthis.slice(0,n-this.slice(0,n).replace(/[x00-xff]/g,"").length)
60};
61/*
62alert("abcdefg".left(3)==="abc")
63alert("中国人cdefg".left(5)==="中国")
64alert("中国abcdefg".left(5)==="中国a")
65*/
66
67
68
69
70//从右边截取n个字符,如果包含汉字,则汉字按两个字符计算
71String.prototype.right=function(n){
72returnthis.slice(this.slice(-n).replace(/[x00-xff]/g,"").length-n)
73};
74
75/*
76alert("abcdefg".right(3)==="efg")
77alert("cdefg中国人".right(5)==="国人")
78alert("abcdefg中国".right(5)==="g中国")
79*/
80
81</script>