# String

# 字符串属性

属性 描述
constructor 返回创建字符串属性函数
length 返回字符串的长度
prototype 允许向对象添加属性和方法

# 访问字符方法

字符串的访问字符方法总共有 chartAt()、中括号[]、charCodeAt()和 fromCharCode()四种

# chartAt()

  • 😏charAt()方法接收一个基于 0 的字符位置的参数,返回指定位置的字符。
  • 😒 当参数为空或 NaN 时,默认参数为 0
  • 😕 当参数超出范围时(大于length或小于 0),则返回一个空字符串

代码示例:

var str = "hello";
console.log(str.charAt(1));   //e
console.log(str.charAt(-1));  //''
console.log(str.charAt(10));  //''
console.log(str.charAt());    <=> str.charAt(0) //h
console.log(str.charAt(NaN)); <=> str.charAt(0) //h

// 返回字符串最后一个字符
console.log(str.chartAt(str.length-1)); // o

[注意]

  • x.charAt(index)
  • x.substring(index, index+1)
  • x.substr(index,1)
  • x.slice(index,index+1) 结果相等
var str = "hello";
console.log(str.charAt(1)); //'e'
console.log(str.substring(1, 2)); //'e'
console.log(str.slice(1, 2)); //'e'
console.log(str.substr(1, 1)); //'e'

# []方法

  • ECMAScript5 定义了另一个访问字符的方法,使用方括号加数字索引来访问字符串中的特定字符。
  • 如果参数超出范围或是 NaN 时,则输出 undefined;
  • 没有参数时,会报错;该方法没有 Number()转型函数的隐式类型转换,但参数为单数值数组时可转换为数值

DANGER

[注意]IE7-浏览器不支持

var str = "hello";
console.log(str[0]);     //h
console.log(str[[1]]);   //e
console.log(str[false]); //undefined
console.log(str[-1]);    //undefined
console.log(str[NaN]);   //undefined
console.log(str[]);      //报错

# charCodeAt()

  • charCodeAt()方法类似于 charAt()方法
  • 接收一个基于 0 的字符位置的参数,但返回的是指定位置的字符 16 位 Unicode 编码。
  • 返回值是一个 16 位的整数,在 0-65535 之间,即 0x0000-0xffff 之间
  • 参数为空或 NaN 时,默认参数为 0;
  • 当参数超出范围时,则返回 NaN
var str = "hello";
console.log(str.charCodeAt()); //104
console.log(str.charCodeAt(0)); //104
console.log(str.charCodeAt(1)); //101
console.log(str.charCodeAt(-1)); //NaN
console.log(str.charCodeAt(10)); //NaN
console.log(str.charCodeAt(NaN)); //104

TIP

同样地,charCodeAt()方法涉及到 Number()函数的隐式类型转换,如果转换为数值,则按照上述规则输出相应值;如果转换为 NaN,则输出第 0 个字符的字符编码

var str = "hello";
console.log(str.charCodeAt(true)); //101
console.log(str.charCodeAt(false)); //104
console.log(str.charCodeAt("abc")); //104
console.log(str.charCodeAt({})); //104
console.log(str.charCodeAt([2])); //l08

# fromCharCode()

  • String 构造函数本身有一个静态方法:fromCharCode()。
  • 接收一个或多个字符编码,然后把它们转换成一个字符串。
  • 从本质上看,这个方法与实例方法 charCodeAt()执行的是相反的操作。
  • 若参数为空或 NaN 时,则返回空字符串;若参数超出 0-65535 的范围,则输出字符不可控
console.log(String.fromCharCode(104, 101, 108, 108, 111)); //'hello'
console.log(String.fromCharCode()); //''
console.log(String.fromCharCode(NaN)); //''
console.log(String.fromCharCode(-1)); // 
console.log(String.fromCharCode(65560)); // 

如果一个字符占用四字节,则需要拆成两个字符表示

console.log(String.fromCharCode(0xd842, 0xdfb7)); // "𠮷"

# 字符串拼接

字符串拼接共有 concat() 和加号 + 两种方法

# concat()

  • 用于将一个或多个字符串拼接起来,返回拼接得到的新字符串,而原字符串不发生改变。
  • 若参数(第一个参数除外)不是字符串,则通过 String()方法隐式转换为字符串,再进行字符串拼接

    语法 str.concat(str2 [,... strN ])

var str1 = "Hello ";
var str2 = "world!";
var n = str1.concat(str2);
console.log(n); // Hello world

DANGER

[注意]第一个参数只能是字符串,如果是其他类型(数组除外)则报错

(10).concat("2"); //报错
true.concat("false"); //报错
({}.concat("abc")); //报错

拼接多个字符

var str = "hello ".concat("world ", ...["I ", "Love ", "you"]);
str;
("hello world I Love you");

TIP

[注意]由于数组也存在 concat()方法,参数会按照首先出现的参数是数组还是字符串来决定如何转换

"1,2,3,".concat([4, 5]); //'1,2,3,4,5'
[1, 2, 3].concat(",4,5"); //[1, 2, 3, ",4,5"]

# 加号运算符(+)

虽然 concat()是专门用来拼接字符串的方法,但实践中使用更多的还是加号运算符(+)。使用加号运算符在许多时候都比 concat()简单方便

var str = "hello ";
console.log(str.concat("world", "!")); // 'hello world!'
console.log(str + "world" + "!"); // 'hello world!'

# 创建子字符串

创建子字符串共有 slice()、substr()和 substring()三种方法

# slice()

  • slice(start,end)方法需要两个参数 start 和 end
  • 返回这个字符串中从 start 位置的字符到 ⚠️(但不包含)end 位置 ⚠️ 的字符的一个子字符串;
  • 如果 end 为 undefined 或不存在,则返回从 start 位置到字符串结尾的所有字符
  • 如果 start 是负数,则 start = max(length + start,0)
  • 如果 end 是负数, 则 end = max(length + end,0)
  • start 和 end 无法交换位置
var str = "hello world"; //length=11
console.log(str.slice()); //'hello world'
console.log(str.slice(0, 2)); //'he'
console.log(str.slice(0, -2)); //'hello wor'
console.log(str.slice(2)); //'llo world'
console.log(str.slice(-2)); //'ld'
console.log(str.slice(2, undefined)); //'llo world'
console.log(str.slice(2, -5)); //'llo '
console.log(str.slice(2, -20)); //''
console.log(str.slice(20)); //''
console.log(str.slice(-2, 2)); //''
console.log(str.slice(-2, -20)); //''
console.log(str.slice(-2, 20)); //'ld'
console.log(str.slice(-20, 2)); //'he'
console.log(str.slice(-20, -2)); //'hello wor'

TIP

  • slice()方法涉及到 Number()转型函数的隐式类型转换,
  • 当 start 被转换为 NaN 时,相当于 start = 0;
  • 当 end 被转换为 NaN 时(end 为 undefined 除外),则输出空字符串
var str = "hello world";
console.log(str.slice(NaN)); //'hello world'
console.log(str.slice(0, NaN)); //''
console.log(str.slice(true, [3])); //'el'
console.log(str.slice(null, undefined)); //'hello world'
console.log(str.slice({})); //'hello world'
console.log(str.slice("2", [5])); //'llo'

# substring()

  • substring(start,end)方法需要两个参数 start 和 end,
  • 返回这个字符串中从 start 位置的字符到(但不包含)end 位置的字符的一个子字符串
  • 如果 end 为 undefined 或不存在,则返回从 start 位置到字符串结尾的所有字符
  • 如果任一参数是 NaN 或负数,则被 0 取代
  • 如果任一参数大于字符串长度,则被字符串长度取代
  • 如果 start 大于 end,则交换它们的值
var str = "hello world";
console.log(str.substring()); //'hello world'
console.log(str.substring(2)); //'llo world'
console.log(str.substring(2, undefined)); //'llo world'
console.log(str.substring(20)); //''
console.log(str.substring(-2, 2)); //'he'
console.log(str.substring(NaN, 2)); //'he'
console.log(str.substring(-2, 20)); //'hello world'
console.log(str.substring(3, 2)); //'l'
console.log(str.substring(3, NaN)); //'hel'
console.log(str.substring(-20, 2)); //'he'
console.log(str.substring(-20, -2)); //''

TIP

同样地,substring()方法也涉及到 Number()转型函数的隐式类型转换

var str = "hello world";
console.log(str.substring(true, [3])); //'el'
console.log(str.substring(null, undefined)); //'hello world'
console.log(str.substring({})); //'hello world'
console.log(str.substring("2", [5])); //'llo'

# substr()

返回指定位置的子字符串

  • substr 方法也是接受两个参数
  • 第一个是返回字符串的开始位置,与 substring/slice 不同的是,
  • 第二个参数是返回字符的个数,而不是结束位置。
var x = "this is a string";
console.log(x.substr(3, 3)); //s i 空格也算是一个字符

# 大小写转换

ECMAScript 中涉及字符串大小写转换的方法有 4 个:toLowerCase()、toLocaleLowerCase()、toUpperCase()、toLocaleUpperCase()

# toLowerCase()

把字符串转换为小写

var str1 = "Hello";
console.log(str1.toLowerCase()); //hello

# toUpperCase()

把字符串转换为小写

var str1 = "hello";
console.log(str1.toUpperCase()); //HELLO

# toLocaleUpperCase()

将字符串转换成大写(针对地区)

# toLocaleLowerCase()

将字符串转换成小写(针对地区)

DANGER

这 4 种方法均不支持 String()隐式类型转换,只支持字符串类型

true.toLowerCase(); //报错
(2).toLocaleLowerCase(); //报错
({}.toUpperCase()); //报错
[].toLocaleUpperCase(); //报错

TIP

[注意]大小写转换方法可以连续使用

var str = "Hello World";
console.log(str.toUpperCase().toLowerCase()); //hello world

将带有分割符的字符串转换为驼峰的形式

var txt = "border-top-left";
var arr = txt.split("-");
for (var i = 1; i < arr.length; i++) {
  arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
}
var result = arr.join("");
console.log(result); //'borderTopLeft"
// --------------------------
var str = "border-top-right";
var arr = str.split("-");
var result = arr
  .map((item, index) => {
    return index > 1 ? item.charAt(0).toUpperCase() + item.slice(1) : item;
  })
  .join("");
result;

# 查找子字符串位置

TIP

有两个从字符串中查找子字符串位置的方法: indexOf()lastIndexOf()通过字符串查找位置 查找子串位置的方法同访问字符方法 charAt()和中括号[]方法 通过位置查找字符

# indexOf()

  • indexOf(searchString,start)方法接收 searchString 和 start 两个参数
  • 返回 searchString 首次出现的位置,如果没有找到则返回-1
  • searchString 表示要搜索的子字符串;
  • start 表示该搜索的开始位置,若忽略该参数或该参数为 undefined、NaN 或负数时,start = 0

注意

  • 一个空格也会占位一个字符
  • 该方法会隐式调用 String()转型函数,将 searchString 非字符串值转换为字符串;
  • 隐式调用 Number()转型函数,将 start 非数字值(undefined 除外)转换为数值

var str = 'hello world world';
console.log(str.indexOf('ld'));            // 9
console.log(str.indexOf('ld',undefined));  // 9
console.log(str.indexOf('ld',NaN));        // 9
console.log(str.indexOf('ld',-1));         // 9
// 释上:start表示该搜索的开始位置,若忽略该参数或该参数为undefined、NaN或负数时,start = 0

console.log(str.indexOf('ld',10));         // 15
console.log(str.indexOf('ld',[10]));       // 15
// 释上 隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数值

console.log(str.indexOf('true',[10]));     // -1
console.log(str.indexOf(false,[10])) <=> str.indexOf('false',10);  // -1
//释上 隐式调用String()、Number转型函数

# lastIndexOf()

  • 与 indexOf()不同,lastIndexOf()从右向左查找
  • lastIndexOf(searchString,start)方法接收 searchString 和 start 两个参数
  • 返回 searchString 第一次出现的位置,如果没有找到则返回-1
  • 隐式调用 String()转型函数,将 searchString 非字符串值转换为字符串;
  • 隐式调用 Number()转型函数,将 start 非数字值(undefined 除外)转换为数值
  • searchString 表示要搜索的子字符串;
  • start 表示该搜索的开始位置,若忽略该参数或该参数为 undefined、NaN 时,start = length - 1;若 start 为负数,start = 0
var string = "hello world world";
// 若忽略该参数或该参数为undefined、NaN时,start = length - 1
console.log(string.lastIndexOf("ld")); //15
console.log(string.lastIndexOf("ld", undefined)); //15
console.log(string.lastIndexOf("ld", NaN)); //15
// 若start为负数,start = 0
console.log(string.lastIndexOf("ld", -1)); //-1
console.log(string.lastIndexOf("h", -1)); //0
console.log(string.lastIndexOf("w", undefined)); //12
// 隐式转换
console.log(string.lastIndexOf("ld", 10)); //9
console.log(string.lastIndexOf("ld", [10])); //9
console.log(string.lastIndexOf("true", [10])); //-1
console.log(string.lastIndexOf(false, [10])); //-1

查找出字符串所有符合条件的子字符串 可以通过循环调用 indexOf()或 lastIndexOf()来找到所有匹配的子字符串

// @params str:目标字符串 value:要查找的自字符串
// @return Array [自字符串在目标字符串中出现的索引]
function allIndexOf(str, value) {
  var result = [];
  var pos = str.indexOf(value);
  while (pos > -1) {
    result.push(pos);
    pos = str.indexOf(value, pos + value.length);
  }
  return result;
}
console.log(allIndexOf("helllhelllhelll", "ll")); //[2,7,12]

lastIndexOf()方法常用于获取 URL 地址中的扩展名

var url = "http://baid.com/test.txt";
function getFileFormat(url) {
  var pos = url.lastIndexOf(".");
  return url.slice(pos + 1);
}
console.log(getFileFormat(url)); // 'txt'

# 正则匹配方法

String 类共有 match()、search()、replace()、split()这 4 种正则匹配方法

# match()

语法 str.match(regexp)

示例 在字符串中查找 "ain"

var str = "The rain in SPAIN stays mainly in the plain";
var n = str.match(/ain/g);
console.log(n); // ["ain", "ain", "ain"]

全局查找字符串 "ain",且不区分大小写

var str = "The rain in SPAIN stays mainly in the plain";
var n = str.match(/ain/gi);
console.log(n); //["ain", "AIN", "ain", "ain"]
  • search()方法接受一个正则或字符串的参数,
  • 返回匹配的内容在字符串中首次出现的位置,类似于不能设置起始位置的 indexOf,找不到返回-1

    WARNING

    [注意]search()方法不执行全局匹配,忽略全局标志 g,也会忽略 RegExp 对象的 lastIndex 属性,总是从字符串的开始位置开始搜索

# replace()

  • replace()方法用于替换一个或多个子字符串。它接收两个参数
  • 第一个是正则表达式或字符串,表示待查找的内容;
  • 第二个是字符串或函数,表示替换内容。返回替换后的字符串

# 字符串替换,只能替换第一个子字符串

var str = "cat,bat,sat,fat";
var result = str.replace("at", "ond");
console.log(result); //'cond,bat,sat,fat'

# 不设置全局标志 g,也只能替换第一个子字符串

var str = "cat,bat,sat,fat";
var result = str.replace(/at/, "ond");
console.log(result); //'cond,bat,sat,fat'

# 设置全局标志 g,替换所有匹配的子字符串

var str = "cat,bat,sat,fat";
var result = str.replace(/at/g, "ond");
console.log(result); //'cond,bond,sond,fond'

# 首字母大写

var text = "one two three";
var result = text.replace(/\b(\w+)\b/g, function(match, m1, pos, originalText) {
  return m1.charAt(0).toUpperCase() + m1.substring(1);
});
console.log(result);

# split() 常用

  • split()方法基于指定的分隔符将一个字符串分割成多个字符串
  • 将结果放在一个数组中,分隔符可以是字符串,也可以是一个 RegExp
  • 该方法可以接受第二个参数(可选)用于指定数组的大小,如果第二个参数为 0-array.length 范围内的值时按照指定参数输出,其他情况将所有结果都输出
  • 若指定分隔符没有出现在字符串中,则以数组的形式返回原字符串的值
var colorText = "red,blue,green,yellow";
console.log(colorText.split(""));
//["r", "e", "d", ",", "b", "l", "u", "e", ",", "g", "r", "e", "e", "n", ",", "y", "e", "l", "l", "o", "w"]
console.log(colorText.split(",")); //["red", "blue", "green", "yellow"]
console.log(colorText.split(",", 2)); //["red", "blue"]
console.log(colorText.split(",", 6)); //["red", "blue", "green", "yellow"]
console.log(colorText.split("-")); //["red,blue,green,yellow"]
console.log(colorText.split(/\,/)); //["red", "blue", "green", "yellow"]
console.log(colorText.split(/e/)); //["r", "d,blu", ",gr", "", "n,y", "llow"]
console.log(colorText.split(/[^\,]+/)); //将除去逗号以外的字符串变为分隔符["", ",", ",", ",", ""],IE8-会识别为[",",",",","]

# 去除首尾空格

  • ECMAScript5 为所有字符串定义了 trim()方法。
  • 会创建一个字符串的副本,删除前置及后缀的所有空白字符,然后返回结果
  • 由于 trim()方法返回的是字符串的副本,所以原始字符串中的前置及后缀空格会保持不变
  • [注意]IE8-浏览器不支持

# trim()

去除字符串两头空白


 


var str = "    hello world   ";
console.log(str.trim()); // 'hello world'
console.log(str); // '    hello world   '

空白字符不仅仅包括空格,还包括制表符(\t)、换行符(\n)和回车符(\r)

"\r\nabc \t".trim(); // 'abc'

用 trim()来判断输入的字符是否为空

if (usename.trim().length) {
  alert("correct");
} else {
  alert("error");
}

用正则表达式模拟 trim()

function fnTrim(str) {
  return str.replace(/^\s+|\s+$/, "");
}
console.log(fnTrim("      hello world   ")); //'hello world'

# trimRight()

firefox、safari 和 webkit 还支持非标准的 trimRight()用于删除字符串结尾的空白字符

var str = "    hello world   ";
console.log(str.trimRight()); //'    hello world';

# Es6 新增

# includes()

  • 返回布尔值,表示是否找到了参数字符串。
  • 第二个参数,表示开始搜索的位置。

示例:查找字符串是否包含 "world"

var str = "Hello world,welcome!";
var n = str.includes("world");
var fuck = str.includes("fuck");
console.log(n); // true
console.log(fuck); //false

在指定的位置后查找是否存在字符串

var str = "Hello world, welcome to the jc-sir.github.io.";
var n = str.includes("world", 12); // false

# startsWith()

  • 表示参数字符串是否在原字符串的头部。
  • 返回 Boolen
  • 第二参数指定开始位置
let s = "Hello world!";
s.startsWith("Hello"); // true
s.startsWith("world", 6); // true

# endsWith()

  • 表示参数字符串是否在原字符串的尾部。
  • 返回 Boolen
  • 第二参数指定开始位置
let s = "Hello world!";
s.endsWith("!"); // true
s.endsWith("Hello", 5); // true

# repeat()

  • repeat 方法返回一个新字符串,表示将原字符串重复 n 次。
  • 参数如果是小数,会被取整。
  • 如果 repeat 的参数是负数或者 Infinity,会报错。
  • 如果 repeat 的参数是字符串,则会先转换成数字。
  • 参数是 0 到-1 之间的小数,则等同于 0,这是因为会先进行取整运算。0 到-1 之间的小数,取整以后等于-0,repeat 视同为 0。
  • 参数 NaN 等同于 0。
"x".repeat(3); // "xxx"
"hello".repeat(2); // "hellohello"
"na".repeat(0); // ""

"na".repeat(2.9); // "nana"
"na".repeat(Infinity); // RangeError
"na".repeat(-1); // RangeError
"na".repeat(-0.9); // ""
"na".repeat(NaN); // ""
"na".repeat("na"); // ""
"na".repeat("3"); // "nanana"

# padStart()

字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

# padEnd()

Last Updated: 12/18/2022, 2:20:01 PM