目录
1 字符串
1.1 字符串表示
- JavaScript 共有 6 种方法可以表示一个字符
字符表示 | "z" | |
转义字符表示 | "\z" | |
UTF-8 编码表示 | "\172" | 这是一个8进制 |
UTF-16 编码表示 | "\x7A" | \x 代表这是一个16进制 |
Unicode 编码表示 | "\u007A" | 码点 007A ,只限于码点在 \\u0000 ~\\uFFFF 之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。 |
Unicode 编码表示 (es6 拓展) | "\u{7A}" |
"\z" === "z"; // true
"\172" === "z"; // true
"\x7A" === "z"; // true
"\u007A" === "z"; // true
"\u{7A}" === "z"; // true
"中" === "\u4e2d"; // true // JavaScript 字符串允许直接输入字符,以及输入字符的转义形式
// “中”的 Unicode 码点是 U+4e2d,可以直接在字符串里面输入这个汉字,也可以输入它的转义形式`\u4e2d`,两者是等价的。
1.1.1 转义
-
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
-
如果在非特殊字符前面使用反斜杠,则反斜杠会被省略。
\a
->a
-
\0
:null(\u0000
) -
\b
:后退键(\u0008
) -
\f
:换页符(\u000C
) -
\n
:换行符(\u000A
) -
\r
:回车键(\u000D
) -
\t
:制表符(\u0009
) -
\v
:垂直制表符(\u000B
) -
\'
:单引号(\u0027
) -
\"
:双引号(\u0022
) -
\\
:反斜杠(\u005C
) -
单引号字符串内部,使用单引号,加上反斜杠转义
-
双引号字符串内部,使用双引号,加上反斜杠转义
'Did she say \'Hello\'?';
// "Did she say 'Hello'?"
"Did she say \"Hello\"?";
// "Did she say "Hello"?"
1.1.2 Unicode 表示法
- Unicode 表示法:大括号包含表示 Unicode 字符(
\u{0xXX}
或\u{0XXX}
)- 下面不能在字符串里面直接使用,只能使用转义形式。
U+005C
:反斜杠(reverse solidus)U+000D
:回车(carriage return)U+2028
:行分隔符(line separator) 正则表达式依然不允许直接输入该字符U+2029
:段分隔符(paragraph separator) 正则表达式依然不允许直接输入该字符U+000A
:换行符(line feed)
- 下面不能在字符串里面直接使用,只能使用转义形式。
1.1.3 字符数组
- 字符串可以被视为字符数组
var s = "hello";
s[0]; // "h"
s[1]; // "e"
s[4]; // "o"
// 直接对字符串使用方括号运算符
"hello"[1]; // "e"
length
属性返回字符串的长度,该属性也是无法改变的。
var s = "hello";
s.length; // 5
1.1.5 字符串模板
- 字符串模板:可单行可多行可插入变量的增强版字符串 反引号 `
- 模板字符串中嵌入变量,需要将变量名写在
${ }
之中 - 模板字符串还能嵌套
- 模板字符串中嵌入变量,需要将变量名写在
- 标签模板:模板字符串紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。
//如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
$("#list").html(`
<ul>
<li>first</li>
<li>second</li>
</ul>
`);
//上面代码中,所有模板字符串的空格和换行,都是被保留的,
//比如<ul>标签前面会有一个换行。如果你不想要这个换行,可以使用trim方法消除它。
$("#list").html(
`
<ul>
<li>first</li>
<li>second</li>
</ul>
`.trim()
);
1.2 字符串遍历
- 字符串遍历:可通过
for-of
遍历字符串,可以识别大于0xFFFF
的码点,传统的for
循环无法识别这样的码点
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
1.3 String 对象
1.3.1 String()
-
String()
将任意值转为字符串:String
本身是一个函数,可以当作工具方法使用,将任意值转为字符串。 -
String()
构造函数:String
不仅可以当作工具函数使用,还可以当作构造函数使用,即前面可以使用new
命令。构造字符串对象 -
字符串对象是一个类似数组的对象(很像数组,但不是数组)。
new String('abc')
// String {0: "a", 1: "b", 2: "c", length: 3}
(new String('abc'))[1] // "b"
1.3.2 String 静态方法
String.fromCharCode()
该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。不能识别码点大于0xFFFF
的字符String.fromCodePoint()
可以识别大于0xFFFF
的字符,弥补了String.fromCharCode()
方法的不足String.raw()
返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。
1.3.3 String 实例属性
String.prototype.length
返回字符串的长度
1.3.4 String 实例方法
1. 字符表示
String.prototype.charAt()
返回指定位置的字符,参数是从0
开始编号的位置,这个方法完全可以用数组下标替代。String.prototype.charCodeAt()
返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCharCode()
的逆操作。String.prototype.codePointAt()
返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCodePoint()
的逆操作。String.prototype.concat()
用于连接两个字符串,返回一个新字符串,不改变原字符串。'a'.concat('b', 'c') // "abc"
concat
如果参数不是字符串,方法会先转为字符串,然后再连接。+
在两个运算数都是数值时,不会转换类型
var one = 1;
var two = 2;
var three = '3';
''.concat(one, two, three) // "123"
one + two + three // "33"
String.prototype.normalize()
将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化
// 许多欧洲语言有语调符号和重音符号,提供合成符号 或 两个字符合成一个字符
// 两种表示方法,在视觉和语义上都等价,但是 JavaScript 不能识别
'\u01D1'==='\u004F\u030C' //false
'\u01D1'.length // 1
'\u004F\u030C'.length // 2
'\u01D1'.normalize() === '\u004F\u030C'.normalize()
// true
2.返回新变量
-
去除空格
String.prototype.trim()
去除字符串两端的空格,返回一个新字符串,不改变原字符串。不仅是空格,还包括制表符\t
、\v
、换行符\n
、回车符\r
String.prototype.trimStart()
消除字符串头部的空格,它们返回的都是新字符串,不会修改原始字符串。String.prototype.trimEnd()
消除尾部的空格
-
大小写转化
String.prototype.toLowerCase()
将一个字符串全部转为小写,返回一个新字符串,不改变原字符串String.prototype.toUpperCase()
将一个字符串全部转为大写,返回一个新字符串,不改变原字符串- 模糊搜索不区分大小写时,搜 A 中有无 B,把 A 和 B 都换成小写或大写即可
-
字符重复
String.prototype.repeat()
方法返回一个新字符串,表示将原字符串重复n
次。
-
字符补齐
String.prototype.padStart()
如果某个字符串不够指定长度,会在头部或尾部补全,用于头部补全'x'.padStart(5, 'ab') // 'ababx'
String.prototype.padEnd()
用于尾部补全'x'.padEnd(5, 'ab') // 'xabab'
-
子字符串 取、匹配
-
String.prototype.slice()
从原字符串取出子字符串并返回,不改变原字符串'JavaScript'.slice(0, 4) // "Java"
-
String.prototype.substring()
从原字符串取出子字符串并返回,不改变原字符串'JavaScript'.substring(0, 4) // "Java"
-
String.prototype.substr()
从原字符串取出子字符串并返回,不改变原字符串'JavaScript'.substr(4, 6) // "Script"
substring()
和slice()
很像,substring
方法会自动更换两个参数的位置,自动将负数转为 0- 由于这些规则违反直觉,因此不建议使用
substring
方法,应该优先使用slice
。
-
String.prototype.match()
确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null
。可以使用正则表达式作为参数'cat, bat, sat, fat'.match('at') // ["at"]
-
String.prototype.matchAll()
方法返回一个正则表达式在当前字符串的所有匹配 -
String.prototype.search()
用法基本等同于match
,但是返回值为匹配的第一个位置。如果没有找到匹配,则返回-1
。可以使用正则表达式作为参数'cat, bat, sat, fat'.search('at') // 1
-
String.prototype.indexOf()
确定字符串在另一字符串中首次出现的位置,返回匹配开始位置。返回-1
表示不匹配。从头部开始匹配'JavaScript'.indexOf('script') // -1
-
String.prototype.lastIndexOf()
从尾部开始匹配 -
String.prototype.includes()
:是否存在指定字符串 -
String.prototype.search()
方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回-1。string1.search(string2) != -1
检索 string1 中是否有 string2,若无则返回 -1
-
String.prototype.startsWith()
是否存在字符串头部指定字符串 -
String.prototype.endsWith()
方法用来判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 true 或 false。str.endsWith(searchString[, length])
length 可选,作为 str 的长度。默认值为 str.length。
-
-
分割截取
String.prototype.split()
按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。可以使用正则表达式作为参数'a|b|c'.split('|') // ["a", "b", "c"]
string1.split("-")
对 string1 按-
截取,返回一个新数组string1.split(/[,|,]/)
对 string1 按,
或,
截取,返回一个新数组string1 = string1.split("-")[0];
string1 现为-
前的字符串string1.substring(0, string1.indexOf("-", 0));
substring 方法用于提取字符串中介于两个指定下标之间的字符
-
字符替换
String.prototype.replace()
替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g
修饰符的正则表达式)。String.prototype.replaceAll()
它的用法与replace()
相同,返回一个新字符串,不会改变原字符串。string1.replace(';', ',')
把第一个;
换成,
string1.replace(/\;/g, ',')
把;
全换成,
-
比较
String.prototype.localeCompare()
比较两个字符串。返回一个整数,- 如果小于0,表示第一个字符串小于第二个字符串;
'apple'.localeCompare('banana') // -1
- 如果等于0,表示两者相等;
- 如果大于0,表示第一个字符串大于第二个字符串。
localeCompare()
方法的最大特点,就是会考虑自然语言的顺序,正常情况下,大写的英文字母小于小写字母。'B'.localeCompare('a') // 1
> = <
采用 Unicode 码点比较,不考虑自然语言的顺序。B
的码点是66,而a
的码点是97'B' > 'a' // false
- 如果小于0,表示第一个字符串小于第二个字符串;
-
字符串转变量
eval('item.name')
3.字符串位置
String.prototype.at()
方法接受一个整数作为参数,返回参数指定位置的字符,支持负索引(即倒数的位置)