前言
前些天写了篇数组的总结,其实我们再来看看字符串,和数组有异曲同工之妙,字符串也可以通过 split
来变成数组,然后使用数组的方法。
另外,对于字符串,其实我们关心的只有一个问题,返回值是什么。
接下来,我会带大家一步步的使用 String
里面所拥有的方法和属性
字符串的属性
length
length属性表示一个字符串的长度。该属性返回字符串中字符编码单元的数量。JavaScript 使用 UTF-16 编码,该编码使用一个 16 比特的编码单元来表示大部分常见的字符,使用两个代码单元表示不常用的字符。因此 length 返回值可能与字符串中实际的字符数量不相同。
空字符串的 length 为 0。
静态属性 String.length 返回 1。
let str = "gating" |
字符串的静态方法
字符的 Unicode 表示法
说到字符串,不得不说 JavaScript 中的字符串的 Unicode
表示形式,JavaScript 允许采用\uxxxx
形式表示一个字符,其中xxxx
表示字符的Unicode
码点。
但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。
// 比如 |
参考链接 ECMAScript 6 入门 建议去了解一下,这里我就不做过多解释了,因为我用的真的不多(主要也是不会)
String.fromCharCode()
String.fromCharCode() 方法返回使用指定的Unicode值序列创建的字符串。
/** |
作用于高位编码(higher values)
尽管绝大部分常用的 Unicode 值可以用一个 16-bit 数字表示(正如 JavaScript 标准化过程早期),并且对于绝大部分值 fromCharCode() 返回一个字符(即对于绝大部分字符 UCS-2 值是 UTF-16 的子集),但是为了处理所有的 Unicode 值(至 21 bits),只用 fromCharCode() 是不足的。由于高位编码字符是用两个低位编码(lower value)表示形成的一个字符,因此String.fromCodePoint() (ES6 规范的一部分)被用来返回这样一对低位编码,从而可以完全表示这些高位编码字符。
String.fromCodePoint()
String.fromCodePoint() 静态方法返回使用指定的代码点序列创建的字符串。
/** |
具体实际用理可以看看 MDN 这里不做阐述了,因为博主这两个方法用着不多 String.fromCharCode()、String.fromCodePoint()
String.raw 和 模板字符串
模板字符串
了解String.raw
时,我们必须先了解一下什么是模板字符串,简单来说模板字符串是增强版的字符串,他用反引号(`)标识。
// 字符串中嵌入变量 |
String.raw
String.raw() 是一个模板字符串的标签函数,它的作用类似于 Python 中的字符串前缀 r 和 C# 中的字符串前缀 @,是用来获取一个模板字符串的原始字面量值的。
/** |
作为函数,String.raw的代码实现基本如下。
String.raw = function (strings, ...values) { |
正则相关
正则推荐观看文末的 正则表达式30分钟入门教程 ,写的非常好
split
split() 方法使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。
Tip: 如果空字符串(“”)被用作分隔符,则字符串会在每个字符之间分割。
/** |
看到这里,是不是感觉可以用通过split
转成数组,使用数组的方法啦?没错是的,还记得前些天我写过一篇数组的方法的总结吗?没错,重新看一遍就可以了O(∩_∩)O
不信,你看,我们可以通过 split
获取字符串的交集或差集哦
/** |
是不是感觉自己已经对字符串了如指掌了吗?
好了,本次教程到此结束了
开个玩笑嘛,接下来我会陆陆续续带大家认识下 string
的方法的。
match
当一个字符串与一个正则表达式匹配时, match()方法检索匹配项
/** |
replace
replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。
replace 十分重要,必须掌握
/** |
实际应用场景中,replace
方法非常灵活,可以做很多我们想要的事,比如:😄
类似于我们的模板引擎 replace 就可以实现,不过这里我就不带着大家实现了= =
在写实例时,我希望可以先搞懂几个概念和用法
newSubStr 的特殊变量名
变量名 | 代表的值 |
---|---|
$$ | 插入一个 “$”。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容。 |
$' | 插入当前匹配的子串右边的内容。 |
$*n* | 假如第一个参数是 RegExp 对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始 |
replace 中 function 的参数
变量名 | 代表的值 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2, ... | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)例如, 如果是用 /(\a+)(\b+)/ 这个来匹配, p1 就是匹配的 \a+ , p2 就是匹配的 \b+。 |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1) |
string | 被匹配的原字符串。 |
你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后, 该函数就会执行。 函数的返回值作为替换字符串。 (注意: 上面提到的特殊替换参数在这里不能被使用。) 另外要注意的是, 如果第一个参数是正则表达式, 并且其为全局匹配模式, 那么这个方法将被多次调用, 每次匹配都会被调用。
在实际应用中,replace
的使用可以满足大部分的操作字符串场景,特别是function的引入,极大的增强了replace的实力,从而使得我们操作字符游刃有余.
在写实例的时,我们需要搞懂几个newSubStr
特殊变量名,他在实际应用中也很有作用
let name = 'gating' |
了解了这些,那么我们就可以做写点比较实际的了
// js 隐藏手机中间5位号码 |
字符编码相关
charAt
charAt() 方法从一个字符串中返回指定的字符
/** |
charCodeAt
charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 (在 Unicode 编码单元表示一个单一的 UTF-16 编码单元的情况下,UTF-16 编码单元匹配 Unicode 编码单元。但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元) 。如果你想要整个代码点的值,使用 codePointAt()。
/** |
codePointAt
codePointAt() 方法返回 一个 Unicode 编码点值的非负整数。
/** |
汉字“𠮷”(注意,这个字不是“吉祥”的“吉”)的码点是0x20BB7,UTF-16 编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript 不能正确处理,字符串长度会误判为2,而且charAt方法无法读取整个字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。
codePointAt 方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制码点 134071(即十六进制的20BB7),在第二个字符(即“𠮷”的后两个字节)codePointAt方法的结果与charCodeAt方法相同。
codePointAt方法返回的是码点的十进制值,如果想要十六进制的值,可以使用toString(16)方法转换一下。
let s = '𠮷a' |
normalize
normalize() 方法会按照指定的一种 Unicode 正规形式将当前字符串正规化.
许多欧洲语言有语调符号和重音符号。为了表示它们,Unicode 提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如O(\u004F)和ˇ(\u030C)合成Ǒ(\u004F\u030C)。
这两种表示方法,在视觉和语义上都等价,但是 JavaScript 不能识别。
/** |
NFC
,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。NFD
,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。NFKC
,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)NFKD
,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
不过,normalize方法目前不能识别三个或三个以上字符的合成。这种情况下,还是只能使用正则表达式,通过 Unicode 编号区间判断。
此内容参考了 阮老师的normalize()
合并填充相关
concat
concat() 方法将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回。
强烈建议使用 赋值操作符(+, +=)代替 concat 方法。因为 concat 性能比较垃圾
/** |
padEnd
padEnd() 方法会用一个字符串填充当前字符串(如果需要的话则重复填充),返回填充后达到指定长度的字符串。从当前字符串的末尾(右侧)开始填充。
/** |
padStart
padStart() 方法用另一个字符串填充当前字符串(重复,如果需要的话),以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用的。
/** |
padStart()的常见用途是为数值补全指定位数和提示字符串格式。
// 生成 10 位的数值字符串 |
repeat
repeat() 构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本。
/** |
repeat 其实很适合我们调试的时候生成多份测试数据,比如
let newData = ["1","2","3"] |
搜索查找相关
indexOf
indexOf() 方法返回调用 String 对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。如果未找到该值,则返回-1。
/** |
实际应用场景中,我们可以使用使用 indexOf 统计一个字符串中某个字符出现的次数
let str = "gating" |
lastIndexOf
lastIndexOf() 方法返回指定值在调用该方法的字符串中最后出现的位置,如果没找到则返回 -1。从该字符串的后面向前查找,从 fromIndex 处开始。
/** |
search
search() 方法执行正则表达式和 String对象之间的一个搜索匹配。
/** |
includes
includes() 方法用于判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。
/** |
在 Firefox 18 - 39中,这个方法的名称叫 contains()。 具体原因请查看
startsWith
startsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“开头”的,根据判断结果返回 true 或 false。
/** |
endsWith
endsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 true 或 false。
/** |
截取相关
slice
slice() 方法提取一个字符串的一部分,并返回一新的字符串。
/** |
注意:slice() 提取的新字符串包括beginSlice但不包括 endSlice。
substr
substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符。
/** |
注意:在IE8下,substr()方法传递负值会返回原始的字符串,IE9修复了此BUG
substring
substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集。
/** |
substring 提取从 indexStart 到 indexEnd(不包括)
- 如果 indexStart 等于 indexEnd,substring 返回一个空字符串。
- 如果省略 indexEnd,substring 提取字符一直到字符串末尾。
- 如果任一参数小于 0 或为 NaN,则被当作 0。
- 如果任一参数大于 stringName.length,则被当作 stringName.length。
- 如果 indexStart 大于 indexEnd,则 substring 的执行效果就像两个参数调换了一样。
转换大小写相关
注意: toLocaleLowerCase、toLocaleUpperCase 按照本地方式把字符串转换为小写。只有几种语言(如土耳其语)具有地方特有的大小写映射。
toLowerCase
toLowerCase() 会将调用该方法的字符串值转为小写形式,并返回。
/** |
toLocaleLowerCase
toLocaleLowerCase() 根据任何特定于语言环境的案例映射,将表示调用字符串的新字符串转换为小写。
/** |
toUpperCase
toUpperCase() 将调用该方法的字符串值转换为大写形式,并返回。
/** |
toLocaleUpperCase
toLocaleUpperCase() 将调用该方法的字符串值转换为大写形式,并返回。
/** |
删除空白字符相关
trim
trim() 方法会从一个字符串的两端删除空白字符。在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR)
/** |
trimRight
trimRight() 方法从一个字符串的右端移除空白字符。
/** |
该特性是非标准的,请尽量不要在生产环境中使用它!
trimLeft
trimLeft() 方法从一个字符串的左端移除空白字符。
/** |
该特性是非标准的,请尽量不要在生产环境中使用它!
两个不知名的方法
toString
toString() 方法返回指定对象的字符串形式。
String 对象覆盖了Object 对象的 toString 方法;并没有继承 Object.toString()。对于 String 对象,toString 方法返回该对象的字符串形式,和 String.prototype.valueOf() 方法返回值一样
/** |
valueOf
valueOf() 方法返回一个String对象的原始值(primitive value)。
String 对象的 valueOf 方法返回一个String对象的原始值。该值等同于String.prototype.toString()。
该方法通常在 JavaScript 内部被调用,而不是在代码里显示调用。
/** |
排序相关
localeCompare
localeCompare() 方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。
新的 locales 、 options 参数能让应用程序定制函数的行为即指定用来排序的语言。 locales 和 options 参数是依赖于具体实现的,在旧的实现中这两个参数是完全被忽略的。
/** |
实际上,我们就可以通过 localeCompare 实现中文排序了。
let arr = ["北京","上海","深圳","广州"] |
localeCompare方法,十分建议看看MDN,因为我实在太菜了 ┭┮﹏┭┮
当比较大量字符串时, 比如比较大量数组时, 最好创建一个 [Intl.Collator](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Collator)
对象并使用compare 属性所提供的函数。
// Intl.Collator 是用于语言敏感字符串比较的 collators构造函数。 |
文中某些知识点参考链接
总结
这里我就不做总结了,留个小作业给各位观众老爷,自己总结下咯
最后,感谢各位观众老爷观看啦O(∩_∩)O