增加
concat()
- 描述:将两个或多个字符串连接起来,并返回一个新的字符串。
- 语法:string.concat(string1, string2, ..., stringX)
- 参数:需要连接的字符串,可以是一个或多个字符串,用逗号分隔。
- 返回值:一个新的字符串,为连接起来的结果。
- 例子:
let str1 = 'Hello';
let str2 = 'World';
let newStr = str1.concat(' ', str2);
console.log(newStr); // 输出:'Hello World'
concat()使用较少,实际中常使用加号(+)运算符连接两个字符串
var str1 = "Hello";
var str2 = " World";
var str3 = "!";
var result = str1.concat(str2, str3);
console.log(result); // output: "Hello World!"
- V8伪代码实现
function concat() {
// 计算总长度
let totalLength = 0;
for (let i = 0; i < arguments.length; i++) {
totalLength += arguments[i].length;
}
// 创建新字符串对象
let result = new String("");
result.length = totalLength;
// 复制字符到新字符串对象
let offset = 0;
for (let i = 0; i < arguments.length; i++) {
let str = arguments[i];
for (let j = 0; j < str.length; j++) {
result[offset + j] = str.charAt(j);
}
offset += str.length;
}
// 返回新字符串对象
return result;
}
repeat()
- 描述:返回一个新字符串,其值为原字符串重复 n 次。
- 语法:string.repeat(count)
- 参数:count 是一个非负整数,表示要将原字符串重复的次数。
- 返回值:一个新的字符串,为重复 count 次原字符串的结果。
- 例子:
let str = 'abc';
let newStr = str.repeat(3);
console.log(newStr); // 输出:'abcabcabc'
- V8伪代码实现
// 用于实现字符串重复功能的函数,返回重复后的字符串
function StringRepeat(count) {
// 如果count不大于0,则返回空字符串
if (count <= 0) {
return '';
}
// 初始化结果和当前字符串
let result = '';
let current = this.valueOf();
// 循环重复字符串
while (count > 1) {
// 如果count是奇数,则将当前字符串添加到结果中
if (count & 1) {
result += current;
}
// 右移一位等于除以2,将当前字符串重复一倍
count >>= 1;
current += current;
}
// 将最后的当前字符串添加到结果中
return result + current;
}
padStart()
- 描述:在字符串的开头添加指定的字符串,直到字符串达到指定长度。
- 语法:string.padStart(targetLength [, padString])
- 参数:targetLength 是字符串需要达到的长度;padString 是要添加的字符串,可选,默认为 ' '。
- 返回值:一个新的字符串,为添加了指定字符串之后的结果。
- 例子:
let str = 'abc';
let newStr = str.padStart(6, '0');
console.log(newStr); // 输出:'000abc'
- V8伪代码实现
function StringPadEnd(targetLength, padString) {
// 获取当前字符串的长度
let len = this.length;
// 如果指定长度小于等于当前长度,直接返回原字符串
if (targetLength <= len) {
return this;
}
// 如果指定了填充字符,则使用填充字符填充字符串,否则使用空格填充
padString = padString || ' ';
// 计算需要填充的字符个数
let padLen = targetLength - len;
// 如果需要填充的字符个数大于填充字符长度,则重复填充字符
if (padLen > padString.length) {
padString += padString.repeat(padLen / padString.length);
}
// 返回填充后的字符串
return this + padString.slice(0, padLen);
}
padEnd()
- 描述:在字符串的结尾添加指定的字符串,直到字符串达到指定长度。
- 语法:string.padEnd(targetLength [, padString])
- 参数:targetLength 是字符串需要达到的长度;padString 是要添加的字符串,可选,默认为 ' '。
- 返回值:一个新的字符串,为添加了指定字符串之后的结果。
- 例子:
let str = 'abc';
let newStr = str.padEnd(6, '0');
console.log(newStr); // 输出:'abc000'
- V8伪代码实现
function StringPadEnd(targetLength, padString) {
// 获取当前字符串的长度
let len = this.length;
// 如果指定长度小于等于当前长度,直接返回原字符串
if (targetLength <= len) {
return this;
}
// 如果指定了填充字符,则使用填充字符填充字符串,否则使用空格填充
padString = padString || ' ';
// 计算需要填充的字符个数
let padLen = targetLength - len;
// 如果需要填充的字符个数大于填充字符长度,则重复填充字符
if (padLen > padString.length) {
padString += padString.repeat(padLen / padString.length);
}
// 返回填充后的字符串
return this + padString.slice(0, padLen);
}
删除
slice()
-
描述:从字符串中提取一个新字符串,返回提取的部分。
-
语法:string.slice(startIndex, endIndex)
-
参数:
- startIndex:要提取的起始位置。如果是负数,那么从字符串结尾开始算起。
- endIndex:提取终止位置的下标。若不提供,则默认提取到字符串末尾。如果是负数,则将其视为从字符串结尾开始倒数的位置。如果省略该参数,则将提取到字符串的最后一个字符。
-
返回值:一个新的字符串,包含从 startIndex 开始,到 endIndex(不包含)之间的所有字符。
-
示例:
const str = "hello world";
const res = str.slice(6, 11); // "world"
- V8伪代码实现
// slice(start, end)
function mySlice(str, start = 0, end = str.length) {
if (start < 0) {
start = str.length + start;
}
if (end < 0) {
end = str.length + end;
}
let result = '';
for (let i = start; i < end && i < str.length; i++) {
result += str[i];
}
return result;
}
substring()
-
描述:从字符串中提取一个新字符串,返回提取的部分。与 slice() 方法类似,但是不接受负数作为参数。
-
语法:string.substring(startIndex, endIndex)
-
参数:
- startIndex:要提取的起始位置。
- endIndex:提取终止位置的下标。若不提供,则默认提取到字符串末尾。
-
返回值:一个新的字符串,包含从 startIndex 开始,到 endIndex(不包含)之间的所有字符。
-
示例:
const str = "hello world";
const res = str.substring(6, 11); // "world"
- V8伪代码实现
// substring(start, end)
function mySubstring(str, start, end = str.length) {
if (start < 0) {
start = 0;
}
if (end < 0) {
end = 0;
}
if (start > end) {
let temp = start;
start = end;
end = temp;
}
let result = '';
for (let i = start; i < end && i < str.length; i++) {
result += str[i];
}
return result;
}
substr()
-
描述:从字符串中提取一个新字符串,返回提取的部分。与 slice() 方法类似,但是接受负数作为参数。
-
语法:string.substr(startIndex, length)
-
参数:
- startIndex:要提取的起始位置。如果是负数,则该参数表示从字符串末尾开始的位置。
- length:要提取的字符数。
-
返回值:一个新的字符串,包含从 startIndex 开始,长度为 length 的字符。
-
示例:
const str = "hello world";
const res1 = str.substr(6, 5); // "world"
const res2 = str.substr(-5, 5); // "world"
- V8伪代码实现
// substr(start, length)
function mySubstr(str, start, length = str.length - start) {
if (start < 0) {
start = str.length + start;
}
if (length < 0) {
length = 0;
}
let result = '';
for (let i = start; i < start + length && i < str.length; i++) {
result += str[i];
}
return result;
}
trim()
- 描述:去除字符串的首尾空格。
- 语法:string.trim()
- 参数:无
- 返回值:去除空格后的新字符串。
- 例子:
var str = " Hello World! ";
var trimmedStr = str.trim();
console.log(trimmedStr); // output: "Hello World!"
- V8伪代码实现
function trim(str) {
let start = 0;
let end = str.length - 1;
// 去除前导空格
while (start < str.length && str[start] === ' ') {
start++;
}
// 去除尾随空格
while (end >= 0 && str[end] === ' ') {
end--;
}
// 返回修剪后的字符串
return str.slice(start, end + 1);
}
修改
replace():
-
描述:该API用于将字符串中的指定子串替换为新的字符串,并返回新的字符串。
-
语法:str.replace(searchValue, newValue)
-
参数:
- searchValue:需要被替换的子串。
- newValue:用于替换的新字符串。
-
返回值:替换后的新字符串。
-
例子:
let str = "Hello, World!";
let newStr = str.replace("World", "ChatGPT");
console.log(newStr); // Output: "Hello, ChatGPT!"
- V8伪代码实现
function replace(str, searchValue, replaceValue) {
let index = str.indexOf(searchValue);
while (index !== -1) {
// 用新字符串替换旧字符串
str = str.slice(0, index) + replaceValue + str.slice(index + searchValue.length);
// 搜索下一个匹配项
index = str.indexOf(searchValue, index + replaceValue.length);
}
return str;
}
toUpperCase():
- 描述:该API用于将字符串转换为大写形式,并返回新的字符串。
- 语法:str.toUpperCase()
- 参数:无
- 返回值:转换为大写形式的新字符串。
- 例子:
let str = "hello, world!";
let upperStr = str.toUpperCase();
console.log(upperStr); // Output: "HELLO, WORLD!"
- V8伪代码实现
// toLowerCase()
// toUpperCase()
function myToUpperCase(str) {
let result = '';
for (let i = 0; i < str.length; i++) {
let charCode = str.charCodeAt(i);
if (charCode >= 97 && charCode <= 122) { // a-z
result += String.fromCharCode(charCode - 32);
} else {
result += str[i];
}
}
return result;
}
toLowerCase():
-
描述:该API用于将字符串转换为小写形式,并返回新的字符串。
-
语法:str.toLowerCase()
-
参数:无
-
返回值:转换为小写形式的新字符串。
-
例子:
let str = "HELLO, WORLD!";
let lowerStr = str.toLowerCase();
console.log(lowerStr); // Output: "hello, world!"
- V8伪代码实现
// toLowerCase()
function myToLowerCase(str) {
let result = '';
for (let i = 0; i < str.length; i++) {
let charCode = str.charCodeAt(i);
if (charCode >= 65 && charCode <= 90) { // A-Z
result += String.fromCharCode(charCode + 32);
} else {
result += str[i];
}
}
return result;
}
查询
charAt():
-
描述:该API用于返回指定位置的字符。
-
语法:str.charAt(index)
-
参数:
- index:需要返回字符的位置,从0开始。
-
返回值:指定位置的字符。
-
例子:
let str = "Hello, World!";
let char = str.charAt(1);
console.log(char); // Output: "e"
- V8伪代码实现
function charAt(str, index) {
if (index < 0 || index >= str.length) {
// 如果索引越界,返回空字符串
return '';
} else {
// 返回指定索引位置的字符
return str[index];
}
}
charCodeAt():
-
描述:该API用于返回指定位置字符的 Unicode 编码。
-
语法:str.charCodeAt(index)
-
参数:
-
- index:需要返回Unicode编码的字符的位置,从0开始。
-
返回值:指定位置字符的Unicode编码。
-
例子:
let str = "Hello, World!";
let unicode = str.charCodeAt(1);
console.log(unicode); // Output: 101
- V8伪代码实现
function charCodeAt(str, index) {
if (index < 0 || index >= str.length) {
// 如果索引越界,返回 NaN
return NaN;
} else {
// 返回指定索引位置的字符的 Unicode 编码
return str.charCodeAt(index);
}
}
indexOf():
-
描述:该API用于返回字符串中第一个匹配的子串的索引位置。如果没有找到匹配的子串,则返回-1。
-
语法:str.indexOf(searchValue, fromIndex)
-
参数:
- searchValue:需要匹配的子串。
- fromIndex(可选):从哪个位置开始查找,默认为0。
-
返回值:第一个匹配的子串的索引位置,如果没有找到则返回-1。
-
例子:
let str = "Hello, World!";
let index = str.indexOf("World");
console.log(index); // Output: 7
- V8伪代码实现
// indexOf(searchValue, fromIndex)
function myIndexOf(str, searchValue, fromIndex = 0) {
if (fromIndex < 0) {
fromIndex = 0;
}
for (let i = fromIndex; i < str.length; i++) {
if (str.substring(i, i + searchValue.length) === searchValue) {
return i;
}
}
return -1;
}
lastIndexOf():
-
描述:该API用于返回字符串中最后一个匹配的子串的索引位置。如果没有找到匹配的子串,则返回-1。
-
语法:str.lastIndexOf(searchValue, fromIndex)
-
参数:
- searchValue:需要匹配的子串。
- fromIndex(可选):从哪个位置开始查找,默认为字符串的末尾。
-
返回值:最后一个匹配的子串的索引位置,如果没有找到则返回-1。
-
例子:
let str = "Hello, World!";
let index = str.lastIndexOf("l");
console.log(index); // Output: 10
- V8伪代码实现
// lastIndexOf(searchValue, fromIndex)
function myLastIndexOf(str, searchValue, fromIndex = str.length - 1) {
if (fromIndex >= str.length) {
fromIndex = str.length - 1;
}
for (let i = fromIndex; i >= 0; i--) {
if (str.substring(i, i + searchValue.length) === searchValue) {
return i;
}
}
return -1;
}
includes():
-
描述:该API用于判断字符串是否包含指定的子串。
-
语法:str.includes(searchValue, fromIndex)
-
参数:
- searchValue:需要匹配的子串。
- fromIndex(可选):从哪个位置开始查找,默认为0。
-
返回值:如果找到匹配的子串,则返回true,否则返回false。
-
例子
let str = "Hello, World!";
let result = str.includes("World");
console.log(result); // Output: true
- V8伪代码实现
function includes(str, searchValue, startIndex) {
startIndex = startIndex || 0;
return str.indexOf(searchValue, startIndex) !== -1;
}
startsWith():
-
描述:该API用于判断字符串是否以指定的子串开头。
-
语法:str.startsWith(searchValue, length)
-
参数:
- searchValue:需要匹配的子串。
- length(可选):需要比较的长度,默认为searchValue的长度。
-
返回值:如果字符串以指定的子串开头,则返回true,否则返回false。
-
例子
let str = "Hello, World!";
let result = str.startsWith("Hello");
console.log(result); // Output: true
- V8伪代码实现
function startsWith(str, searchValue, startIndex) {
startIndex = startIndex || 0;
return str.indexOf(searchValue, startIndex) === startIndex;
}
endsWith():
-
描述:该API用于判断字符串是否以指定的子串结尾。
-
语法:str.endsWith(searchValue, length)
-
参数:
- searchValue:需要匹配的子串。
- length(可选):需要比较的长度,默认为searchValue的长度。
-
返回值:如果字符串以指定的子串结尾,则返回true,否则返回false。
-
例子:
let str = "Hello, World!";
let result = str.endsWith("!");
console.log(result); // Output: true
- V8伪代码实现
function endsWith(str, searchValue, length) {
length = length || str.length;
return str.lastIndexOf(searchValue) === length - searchValue.length;
}
match():
- 描述:在字符串中搜索指定的子串或正则表达式,并返回找到的子串。
- 语法:string.match(regexp)
- 参数:regexp,一个正则表达式对象或者字符串。
- 返回值:匹配结果数组或者null。
- 例子:
var str = "The quick brown fox jumps over the lazy dog.";
var regex = /quick/;
var res = str.match(regex);
console.log(res); //output: ["quick"]
- V8伪代码实现
function match(str, pattern) {
return str.match(pattern);
}
search():
- 描述:在字符串中搜索指定的子串或正则表达式,并返回第一个匹配的位置。
- 语法:string.search(regexp)
- 参数:regexp,一个正则表达式对象或者字符串。
- 返回值:第一个匹配的位置或者-1。
- 例子:
var str = "The quick brown fox jumps over the lazy dog.";
var regex = /quick/;
var res = str.search(regex);
console.log(res); //output: 4
- V8伪代码实现
function match(str, regexp) {
return str.match(regexp) || [];
}
split()
-
描述:
split()方法将一个字符串分割成一个字符串数组,将字符串划分为多个子字符串,返回的数组中包含子字符串的集合,每个子字符串之间使用指定的分隔符进行分割。 -
语法:
str.split(separator, limit)separator(可选):指定字符串分隔符,用于将字符串分割成多个子字符串。如果省略separator参数,则将字符串划分为单个字符数组。分隔符可以是字符串、正则表达式、字符组等,如果separator参数为空字符串,则将字符串分割为单个字符的数组。limit(可选):一个整数,用于指定分隔出的子字符串的最大数量。如果省略limit参数,则split()方法将分隔字符串中的所有元素。如果指定的limit参数小于0或等于Infinity,则将忽略该参数。
-
参数:
separator:指定字符串分隔符。limit:一个整数,用于指定分隔出的子字符串的最大数量。
-
返回值:返回一个数组,其中包含根据指定分隔符分隔的子字符串集合。如果字符串不包含分隔符,则返回包含整个字符串的单元素数组。
-
V8 引擎的伪代码实现:
function split(separator, limit) {
const source = String(this);
const result = [];
let count = 0;
if (separator === undefined || separator === null) {
result.push(source);
return result;
}
if (typeof separator === 'string') {
if (separator === '') {
for (let i = 0; i < source.length; i++) {
result.push(source[i]);
if (count++ === limit - 1) {
break;
}
}
} else {
let start = 0;
let end = source.indexOf(separator);
while (end !== -1 && count++ < limit - 1) {
result.push(source.slice(start, end));
start = end + separator.length;
end = source.indexOf(separator, start);
}
result.push(source.slice(start));
}
}
return result;
}