-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstring.js
More file actions
141 lines (119 loc) · 6.09 KB
/
string.js
File metadata and controls
141 lines (119 loc) · 6.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
* @file String对象的兼容处理
* @author 龙泉 <yangtuan2009@126.com>
*/
(function(){
var strPro = String.prototype;
/**
* 去除目标字符串首尾两端的所有空格,并作为新字符串返回
* 该方法在ECMAScript5中被提出,目前在IE6~8中不被支持
* @return {String}
*/
!strPro.trim && (strPro.trim = function() {
return this.replace(/^\s*|\s*$/g, '');
});
/**
* 判断目标字符串中是否存在检索字符串
* 该方法在ECMAScript6中被提出, 浏览器支持:Chrome 41+、Firefox 40+、Safari 9+,IE不支持
* @param {String} [search] 需要检索的字符串,非字符串时将转换为字符串再进行处理
* @param {Number} [position] 指定开始查找的索引位置,默认为0(非正数情况一律默认为0)
* @return {Boolean}
*/
!strPro.includes && (strPro.includes = function(search, position) {
return this.indexOf(search, position) >= 0;
});
/**
* 判断目标字符串是否以检索字符串开头
* 该方法在ECMAScript6中被提出, 浏览器支持:Chrome 59+、Firefox 17+
* @param {String} [search] 需要检索的字符串,非字符串时将转换为字符串再进行处理
* @param {Number} [position] 指定本次检索中“目标字符串”的起始位置,默认为0(非正数情况一律默认为0)
* @return {Boolean}
*/
!strPro.startsWith && (strPro.startsWith = function(search, position) {
// 当position参数大于0时,实际上是将该索引位置及后续的所有字符作为新的“目标字符串”后再做判断
return this.substring(position).indexOf(search) == 0;
});
/**
* 判断目标字符串是否以检索字符串结束
* 该方法在ECMAScript6中被提出, 浏览器支持:Chrome 59+、Firefox 17+
* @param {String} [search] 需要检索的字符串,非字符串时将转换为字符串再进行处理
* @param {Number} [position] 指定本次检索中“目标字符串”的结束位置,默认为原字符串的长度(当该值小于1时,将返回false)
* @return {Boolean}
*/
!strPro.endsWith && (strPro.endsWith = function(search, position) {
// 当指定了position参数时,实际上是将该索引位置之前的所有字符作为新的“目标字符串”后再做检索判断
return new RegExp(search + '$').test(position === undefined ? this : this.substring(0, position));
});
/**
* 返回目标字符串重复连接指定次数后的新字符串
* 如果参数为空或者为0,则返回空字符串。
* 如果参数为数字字符串,则作为数字处理。
* 该方法在ECMAScript6中被提出, 浏览器支持:Chrome 41+、Firefox 24+、Safari 9+
* @param {Number} [count] 指明需要重复连接的次数,如果为空或者不是一个有效数字将返回空字符串
* @return {String}
*/
!strPro.repeat && (strPro.repeat = function(count) {
return isNaN(count = Number(count)) ? '' : new Array(count + 1).join(this);
});
/**
* 返回 使用填充字符串对目标字符进行前置填充达到指定长度 后的新字符串
* 该方法在ECMAScript 2017中被提出, 浏览器支持:Chrome 57+、Firefox 48+、Safari 10+、Edge 15+,IE不支持
* @param {Number} [targetLen] 目标长度,默认为目标字符串的长度,如果指定的长度小于目标字符串的长度,则返回原目标字符串
* @param {String} [padStr] 填充字符串,默认使用空格进行填充,如果填充字符串太长使得填充后的字符串长度超过了目标长度,则只保留最左侧的填充部分,其它部分会被截断
* @return {String}
*/
!strPro.padStart && (strPro.padStart = function(targetLen, padStr) {
return returnPadStr(this, 'start', targetLen, padStr);
});
/**
* 返回 使用填充字符串对目标字符进行末尾填充达到指定长度 后的新字符串
* 该方法在ECMAScript 2017中被提出, 浏览器支持:Chrome 57+、Firefox 48+、Safari 10+、Edge 15+,IE不支持
* @param {Number} [targetLen] 目标长度,默认为目标字符串的长度,如果指定的长度小于目标字符串的长度,则返回原目标字符串
* @param {String} [padStr] 填充字符串,默认使用空格进行填充,如果填充字符串太长使得填充后的字符串长度超过了目标长度,则只保留最左侧的填充部分,其它部分会被截断
* @return {String}
*/
!strPro.padEnd && (strPro.padEnd = function(targetLen, padStr) {
return returnPadStr(this, 'end', targetLen, padStr);
});
/**
* 填充字符以使目标字符串达到指定长度
* @param {String} oldStr 目标字符串
* @param {String} dir 填充的方向,"start"——前置填充,"end"——末尾填充
* @param {Number} targetLen 目标显示长度
* @param {String} strPad 填充字符串
* @return {String} 字符串填充后的结果
*/
function returnPadStr(oldStr, dir, targetLen, strPad) {
var oldLen = oldStr.length, appendStr = '', appendLen;
targetLen = Number(targetLen) || 0;
strPad = strPad || ' ';
if(oldLen < targetLen) {
appendLen = targetLen - oldLen;
appendStr = new Array(Math.floor(appendLen / strPad.length) + 2).join(strPad);
appendStr = appendStr.substring(0, appendLen);
return dir === 'start' ? (appendStr + oldStr) : (oldStr + appendStr);
}
return oldStr.toString();
}
})();
/**
* 返回目标字符串的字节长度,一个汉字等于2个字节
* @param {string} str 目标字符串
* @return {number}
*/
function getByteLen(str) {
return (str + '').replace(/[^\x00-\xff]/ig, '**').length;
// 上述方式和下面注释的方式,在运行效率方面不相上下
// 但是上述方式代码精简,所以采取最优方案
//
// var result = 0,
// testSingle = /[\x00-\xff]/ig, // 匹配单字节
// str = '' + str,
// len = str.length,
// i = 0;
// for(; i < len; i++) {
// testSingle.lastIndex = 0;
// result += testSingle.test(str[i]) ? 1 : 2;
// }
// return result;
}