JavaScript-String
字符串
基本字符串
- 基本字符串包括:
字符串字面量:通过单引号或双引号定义)
直接调用 String 方法(没有)的字符串 - 基本字符串需要调用一个字符串对象才有的方法或者查询值的时候(基本字符串是没有这些方法的),JavaScript 会自动将基本字符串转化为字符串对象并且调用相应的方法或者执行查询。
let str1 = "something" // 字符串字面量 let str2 = String(something) // String 方法定义
字符串对象
- 字符串对象的创建需要通过 new 关键字生成字符串对象实例:
new String(something)
- 将字符串对象转换为基本字符串的方法:
let str = new String(something) let strVal = valueOf(str)
eval
方法对基本字符串与字符串对象的不同处理:eval
会将基本字符串作为源代码处理; 对字符串对象则直接返回字符串对象(返回的依旧是字符串对象)let str1 = "1 + 1" let st2r = new String("1 + 1") eval(str1) // 返回 Number 值 2 eval(str2) // 返回 String ('1+1')
模板字面量
- 模板字面量是允许嵌入表达式的字符串字面量,可以使用 多行字符串 和 字符串插值 功能;
- 描述:模板字面量使用反引号(``)代替普通字符串的单双引号
- 多行字符串:任何字符都是模板字符串中的一部分,包括换行符
- 字符串插值:使用
${expression}
作为占位符// 模板字面量使用反引号代替单双引号 let str1 = `string text` // 多行字符串 let str2 = `line1:string text line2:string text line3:string text ` // 字符串插值 let str3 = `string text ${expression} string text`
- 嵌套模板:占位符内使用反引号无需转义
- 标签函数:标签函数的第一个参数包含一个字符串值的数组,其余的参数与表达式相关。
- 原始字符串:在标签函数的第一个参数中,存在一个特殊的属性raw ,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换,其原理是 String.raw() 方法。
// 嵌套模板 let age = 23; let str4 = `I am a "Young" : `${age < 30 : "n adult" : "middle-aged"`}`; // 标签函数 function tagFunc(strings, ...keys){/*...*/} tagFunc`text1 ${exp1} text2 ${exp2} text3` // 原始字符串,以下两中创建方法结果一致 let str5 = String.raw`string text ${exp} string text` let str6 = String.raw(raw: {"string text "," string text"}, exp)
转义字符
普通的可打印字符以外,一些有特殊功能的字符可以通过转义字符的形式放入字符串:
Code | OutPut | Code | OutPut |
---|---|---|---|
\0 | 空字符 | \v | 垂直制表符 |
\' | 单引号 | \t | 水平制表符 |
\" | 双引号 | \b | 退格符 |
\\ | 反斜杠 | \f | 换页符 |
\n | 回车符 | \uXXXX | Unicode 码 |
\r | 换行符 | \xXXX | Latin-1 字符 |
字符串属性
- 字符串长度
var n = str.length
字符串方法
增
- str.concat(): 将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回
功能与操作连接符(+、+=)等同,但连接操作符性能更优let str1 = "text1 " let str2 = "text2" let str3 = str1.concat(str2); // "text1 text2"
删
改
查
- str[Symbol.iterator]():返回一个可迭代对象对象,它遍历字符串的代码点,返回每一个代码点的字符串
var str = 'A\n\uD835\uDC69\uD835\uDC6A'; var strIter = str[Symbol.iterator](); // 通过 strIter.next() 访问每一个代码点对应的字符串
- str[index]、str.at(index)、str.charAt(index):查询指定索引的字符
var str = "string text"; let s1 = str[0]; // s let s2 = str.at(1); // t let s3 = str.charAt(2); // r
区别:str[index]
与str.at(index)
中索引大于字符串长度时返回 undefined ,str.charAt(index)
返回空字符""
;str.charAt(index)
不支持index < 0
;- 部分浏览器还不支持
str.at(index)
方法;
- charCodeAt(index):返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元
codePointAt(index): 方法返回 一个 Unicode 编码点值的非负整数
区别:- 如果指定的 index 小于 0 、等于或大于字符串的长度,则 charCodeAt() 返回 NaN,codePointAt() 返回 undefined
- 对于 Unicode 码点不能用一个 UTF-16 编码单元表示(因为它的值大于0xFFFF),
charCodeAt()
只能返回的编码单元码点代理对的第一个编码单元, 而codePointAt()
可以返回整个代码点,但是遇到代码点的第二编码个单元时,codePointAt()
也是只返回第二个编码单元// \uD835\uDC68 表示 𝑨,\uD835\uDC69 表示 𝑩,\uD835\uDC6A 表示 𝑪 var str = 'A\uD835\uDC68\uD835\uDC69\uD835\uDC6A'; // 'A𝑨𝑩𝑪' let code1 = charCodeAt(1) // 返回 55349 即\uD835, let code2 = codePointAt(1) // 返回 119912 即\uD835\uDC68B let code1 = charCodeAt(2) // 返回 56424 即\uDC68B, let code2 = codePointAt(2) // 返回 56424 \uDC68B
- str.endsWith(serch, length) 判断字符串是否是以另外一个给定的子字符串“结尾”,返回布尔值
search 代表需要查询的子字符串
maxL 表示查询的字符串长度(即 maxL-1 位作为最后一位),默认为 str.length;
如果 maxL < 0 返回 maxL = 0,若 maxL > str.length, maxL = str.lengthvar str = "I Love You!" console.log(str.endsWith("ov", 5)) // true console.log(str.endsWith("!")) // true
-