JS —— String概述

描述

在JS中,String 对象用于表示和操作字符序列。字符串是以文本形式表示的数据。

加粗样式

length
String 类型的 length 数据属性表示字符串的 UTF-16 码元长度。对于基本字符而言,1个字符是1个码元长度也就是length为1。而对于辅助字符来说,1个字符是由2个码元来表示所以length长度为2。

创建字符串
创建字符串有很多中方法,下面只是几种常用的方式

const string1 = "使用双引号声明,是基本数据类型";
const string2 = '使用单引号声明,是基本数据类型';
const string3 = `使用模板字符串声明,是基本数据类型`;
const string4 = String("A String object");      //当String作为函数被调用时,它会将参数强制转换为一个字符串原始类型。Symbol 值会被转换成 "Symbol(description)",其中 description 是该 Symbol 的 description 属性值,而不会抛出错误。
const string4 = new String("A String object");  //当String作为构造函数(使用 new)被调用时,它会创建一个 String 对象,该对象不是原始类型。

访问字符
访问字符串中的字符有3种常用的方式

const str = "AaBb";
// 1.使用 String.at(index)方法, 它接收一个整数值index,并返回一个新的 String,该字符串由位于指定偏移量处的单个 UTF-16 码元组成。该方法允许index为正整数和负整数和0。负整数从字符串中的最后一个字符开始倒数。如果找不到指定的索引,则返回 undefined。
console.log(`${str.at(0)}${str.at(1)}${str.at(-2)}${str.at(-1)}`) //'AaBb'
// 2.使用String.charAt(index)方法, 它接收一个字符的索引index(从0开始),返回一个由给定索引index处的单个 UTF-16 码元构成的新字符串。如果 index 超出了0 ~ str.length-1的范围,将返回一个空字符串。
console.log(`${str.charAt(0)},${str.charAt(1)},${str.charAt(-1)},${str.charAt(10)}`) //'A,a,,'
// 3.使用数字索引[index], 该方法等价于charAt(index),但区别是index越界返回undefined而不是空字符串。
console.log(`${str[2]},${str[3]},${str[-1]},${str[10]}`) //'B,b,undefined,undefined'

由于JS内部是使用UTF-16编码,并且字符串表示为UTF-16 码元的序列。当遇到辅助字符时只访问2个码元中的其中一个并不能得到对应的完整辅助字符。例如(“🆗”.charAt(0) 返回的是 ‘\uD83C’,而不是完整的’\uD83C\uDD97’)。针对这种字符我们需要使用String.codePointAt()和String.fromCodePoint()

// 使用String.codePointAt(index)返回一个非负整数,该整数是从给定索引index位置开始的字符的Unicode码点。(索引位置仍然按照码元检索)
// 规则: 如果index越界则返回undefined,若index处于高位代理则返回完整的代理对码点,若index处于低位代理则只返回低位代理的码点
const code = "🆗".codePointAt(0)  // 127383  得到完整的字符码点
// 使用String.fromCodePoint(num1,num2,...,numN) 静态方法将根据指定的码位序列返回一个字符串。numN代表一个完整的Unicode码点
String.fromCodePoint(code)        //"🆗"  根据指定的码位序列返回一个字符串

概括的来说

  • at() 和 charAt() 方法用于取指定位置码元所代表的字符,区别在于at()可以传入负整数用于从后往前检索,charAt()不可。at()越界时返回undefined,charAt()越界返回空字符串。
  • charCodeAt() 和 codePointAt() 方法返回指定位置的码点,区别在于codePointAt()识别范围大于charCodeAt(),更完整。
  • fromCharCode() 和 fromCodePoint() 方法都是返回给定码点序列的字符串,区别在于fromCharCode里传入的每个码点只能在65535以内,fromCodePoint可以返回大于这个范围的字符。

比较字符
使用"==“,” === “,”<“和”>"运算符来比较字符串

const a="a",b="b",A="A",B="B";
console.log(a>b,a<b,a==A,b===B) // false true false false

注意,所有的比较运算符(包括 === 和 ==)在比较字符串时都区分大小写。不区分大小写地比较字符串的常见方式是在比较它们之前将它们转为相同的大小写(大写toUpperCase()或者小写toLowerCase()),但是这种情况并不是可靠的。

//例如德语小写字母 ß 和 ss 都被 toUpperCase() 转换为 SS
console.log("ß".toUpperCase() === 'ss'.toUpperCase()) //true 实际应该位 false
//土耳其字母 ı 会被 toLowerCase() 错误地报告为不等于 I
console.log("ı".toLowerCase() === 'I'.toLowerCase()) //false 实际应该为 true

用于测试不区分大小写的相等性的本地化(locale-aware)且可靠的解决方案是使用 Intl.Collator API 或者字符串的 localeCompare() 方法——它们共享相同的接口——sensitivity 选项设置为 “accent” 或 “base"或"case"或"variant”,区别在于匹配规则,具体见Intl.Collator()

//referenceStr.localeCompare(compareString, locales, options)方法返回一个数字
//referenceStr:引用字符; compareString:比较字符; locales:缩写语言代码; options:配置项;
//规则: 若返回负数表示引用字符(referenceStr)在比较字符(compareString)之前,若为正数表示引用字符在比较字符之后,为0表示字符相同
console.log("ß".localeCompare("ss","de",{sensitivity: "accent"})) //false
console.log("ı".localeCompare("I","tr",{sensitivity: "accent"}))  //true
//PS: 当需要对一组字符进行排序时,可以通过Intl.Collator().compare方法进行排序
['我','爱','你','中','国','沃'].sort(new Intl.Collator("pinyin").compare) //['爱', '国', '你', '我', '沃', '中']

字符串原始值和字符串对象
字符串字面量(使用单引号或者双引号表示)和从非构造函数上下文中的 String 调用返回的字符串(即在不使用 new 关键字的情况下调用)是原始字符串。在需要调用原始字符串的方法或进行属性查找的上下文中,JavaScript 将自动包装原始字符串并在包装对象上调用方法或执行属性查找。
基本上任何应用场景都不会将String()作为构造器函数使用 !
使用 eval() 时,字符串原始值和 String 对象也会给出不同的结果。传递给 eval 的原始值被当作源代码处理;而 String 对象则被当作对象处理,返回对象。

const s1 = "2 + 2"; // 创建一个字符串原始值
const s2 = new String("2 + 2"); // 创建一个 String 对象
console.log(eval(s1)); // 返回数字 4
console.log(eval(s2)); // 返回字符串“2 + 2”

因此,当一段代码在期望使用字符串原始值的时候却使用了 String 对象是,可能会导致执行失败。

字符串强制转换
许多内置操作首先将它们的参数强制转换为字符串(这就是为什么 String 对象的行为类似于字符串原始值的原因)。

  • 字符串按原样返回。
  • undefined 转换成 “undefined”。
  • null 转换成 “null”。
  • true 转换成 “true”;false 转换成 “false”。
  • 使用与 toString(num) 相同的算法转换数字。
  • 使用与 toString(num) 相同的算法转换 BigInt。
  • Symbol 抛出 TypeError。
  • 对于对象,首先,通过依次调用其 [@@toPrimitive]()(hint 为 “string”)、toString() 和 valueOf() 方法将其转换为原始值。然后将生成的原始值转换为一个字符串。

有几种方法可以在 JavaScript 中实现几乎相同的效果。

  • 模板字符串:${x} 为嵌入的表达式执行上面的字符串强制转换步骤
  • String() 函数:String(x) 使用相同的算法去转换 x,只是 Symbol 不会抛出 TypeError,而是返回 “Symbol(description)”,其中 description 是对 Symbol 的描述。
  • 使用 + 运算符:“” + x 将其操作数强制转为原始值,而不是字符串,并且对于某些对象,其行为与普通字符串强制转换完全不同。有关更多细节,请参见其参考页。

转义字符
在 JavaScript 中,转义符用于表示一些特殊字符,例如换行、制表符等,或者是需要特殊处理的字符,如引号和反斜杠。

  • \n: 表示换行符。
  • \t: 表示制表符。
  • \: 表示反斜杠字符。
  • \": 表示双引号字符。
  • \': 表示单引号字符。
  • \uXXXX: 表示一个 Unicode 字符,其中 XXXX 是四位十六进制数。
  • \xXX: 表示一个 ASCII 字符,其中 XX 是两位十六进制数。
console.log("Hello\nWorld"); // 换行
console.log("Tab\tSeparated"); // 制表符
console.log("Backslash: \\"); // 反斜杠
console.log("Double Quote: \""); // 双引号
console.log('Single Quote: \''); // 单引号
console.log("\u0041"); // Unicode 字符 "A"
console.log("\x41"); // ASCII 字符 "A"

字符串转义是默认的行为,有时候我们若不需要转义时可以使用String.raw()方法,它用于获取创建模板字符串时的原始字符串形式。但对于模板字符串中的替换表达式任然会被替换处理,但转义序列(例如 \n)不会被处理。

// 例如: 当我们需要输出一段路径地址时,直接用反斜杠会被当做转义符
console.log(`C:\Development\profile\aboutme${1+2}.html`) // 输出 'C:Developmentprofileaboutme3.html'
// 使用raw()方法
console.log(String.raw`C:\Development\profile\aboutme${1+2}.html`) // 输出 C:\Development\profile\aboutme3.html
// 使用raw()方法相当于取消转义
console.log(`C:\\Development\\profile\\aboutme${1+2}.html`) // 输出 C:\Development\profile\aboutme3.html

注意, String.raw()只适用于模板字符串

String的更多实例方法

  1. String.concat(str1, … , strN) : 合并两个(或更多)字符串的文本并返回一个新字符串。
  2. String.startsWith(str) : 确定调用字符串是否以字符串 str 的字符开头。
  3. String.endsWith(str) : 确定字符串是否以字符串 str 的字符结尾。
  4. String…includes(str) : 确定调用字符串是否包含 searchString。
  5. String.indexOf(str) : 返回在调用 String 对象中第一次出现的 str 的索引,如果未找到则返回 -1。
  6. String.lastIndexOf(str) : 返回在调用 String 对象中最后一次出现的 str 的索引,如果未找到则返回 -1。
  7. String.isWellFormed() : 返回一个布尔值,指示此字符串是否包含任何孤代理项。
  8. String.match() : 用于将正则表达式 regexp 与字符串匹配。
  9. String.matchAll() : 返回所有 regexp 的匹配项的迭代器。
  10. String.normalize() : 返回调用字符串值的 Unicode 规范化形式。
  11. String.padStart(len,str) : 用给定字符串 str 从头部填充当前字符串并返回长度为 len 的新字符串。
  12. String.padEnd(len,str) : 用给定字符串 str 从末尾填充当前字符串并返回长度为 len 的新字符串。
  13. String.repeat(count) : 返回重复 count 次组成的字符串。
  14. String.replace(pattern, replacement) : 匹配并替换字符串中的第一个pattern字符为replacement。
  15. String.replaceAll(pattern, replacement) : 匹配并替换字符串中的所有pattern字符为replacement。
  16. String.search(regexp) : 搜索正则表达式 regexp 和调用字符串之间的匹配项。和indexOf区别是它可以用正则表达式匹配
  17. String.slice(sInx,eInx) : 提取字符串的 [sInx,eInx) 部分并返回一个新字符串,不修改原始字符串。sInx,eInx为负数时代表倒序索引。
  18. String.substring(sInx,eInx) : 提取字符串的 [sInx,eInx) 部分并返回一个新字符串,不修改原始字符串。和slice的区别是它不支持倒序索引,sInx与eInx小于0 时按0处理。
  19. String.split(sep) : 返回一个由在出现子字符串 sep 时拆分调用的字符串然后填充的字符串数组。
  20. String.toString() : 返回表示指定对象的字符串。重写 Object.toString() 方法。
  21. String.trim() : 修剪字符串开头和结尾的空格。
  22. String.trimStart() : 修剪字符串开头的空格。
  23. String.trimEnd() : 修剪字符串结尾的空格。
  24. String.valueOf() : 返回指定对象的原始值。重写 Object.prototype.valueOf() 方法。
  25. String[@@iterator]() : 返回一个新的迭代器对象,该对象迭代 String 值的码位,将每个码位作为 String 值返回。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值