JavaScript字符串操作:内置对象与Unicode编码详解

313 阅读6分钟

内置对象的概念

内置对象:指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或者是最基本必要的功能(属性和方法)。

常见的内置对象:Math对象、日期对象Date()、数组对象、 字符串对象

字符串对象

1.创建字符串的两种方式

1.直接通过字面量创建为原始值

const string1 = '晚饭吃什么'
const string2 = 'McDonalds'

2.通过String().构造函数创建为字符串对象

const string3 = new String('This is a String Object')

2.访问字符

有两种方式访问字符串中的单个字符,第一种是 charAt() 方法:

//传入一个参数,返回一个由给定索引处的单个字符构成的新字符串
//取到'吃'
console.log('晚饭吃什么'.charAt(2))

第二种是直接将字符串视为类数组对象,其中各个字符对应于一个数字索引。

console.log('晚饭吃什么'[2])//取到'吃'

charAt() 和使用方括号表示法访问指定索引处的字符非常相似。它们的主要区别在于:

  • charAt() 尝试将 index 转换为整数,而方括号表示法不会,直接使用 index 作为属性名。
  • 如果 index 超出范围,charAt() 返回一个空字符串,而方括号表示法返回 undefined

3.常用的字符串方法集合

String.charAt() - - 获取index位置处的字符

String.charCodeAt(index) - - 获取index位置处字符的unicode编码

String.concat() - - 字符串连接

String.indexOf()- - 查找符合条件的第一个字符串所在下标

String.lastIndexOf() - - 查找符合条件的第一个字符串所在下标(从后往前查)

String.match()--用于将正则表达式与字符串匹配

String.slice() - - 截取子字符串

String.split() - - 切割字符串不传值的话就是直接把字符串用数组包起来,传值就是以值为分割。

String.replace(oldString, newString) - - 替换

String.prototype.toLocaleUpperCase( [locale, ...locales])- - 转换为大写

String.prototype.toLocaleLowerCase() - - 转换为小写

String.trim() - - 去掉前后空白

String.trimStart() - - 去除头部空白

String.trimEnd() - - 去除尾部空白

插播一下:什么东西是Unicode编码ಠ_ಠ?

Unicode简介

Unicode,官方中文名称“统一码”。通常大家谈到的 Unicode 一般指字符集的意思,但 Unicode 标准实际涵盖两个方面的内容:

  • Unicode 字符集
  • Unicode 编码

众所周知,计算机不能直接识别字符串,它只能处理二进制数据也就是0和1,所以要想计算机搞懂我们霹雳巴拉写了些啥,我们需要一种方法将文本(字符串)转换为计算机可以理解和处理的二进制格式。

1.Unicode字符集

Unicode字符集就像一本全球通用的“字典”,为世界上几乎所有的字符分配了一个唯一的编号,称为码点。例如:

  • 字母A的Unicode码点是U+0041
  • 汉字的Unicode码点是U+4E00
  • 表情符号😊的Unicode码点是U+1F60A

Unicode 字符集规定了字符对应的唯一码点,但在实际的传输、存储过程中,为了兼顾各系统平台的差异、节省空间,需要对字符集进行编码——将对应的码点转换成另一种格式,即Unicode转换格式(Unicode Transformation Format,简称 UTF)。

2.Unicode编码

Unicode 编码规则(UTF)决定了码点如何在文件中显示,我们熟知的UTF-8 UTF-16就是编码规则的不同版本。

UTF-8UTF-16

它们的作用就是定义了如何将Unicode的码点转换成实际存储或传输时使用的二进制序列。

我们HTML头部的这句代码就是在声明文档的字符编码规则为UTF-8,它告诉浏览器在解析HTML文档时应该使用UTF-8编码规则来正确显示网页内容。

UTF-8 编码过程(了解)

UTF-8 是一种针对 Unicode 的可变长度字符编码,根据码点的大小,将其编码为 1 到 4 个字节,具体规则如下:

U+0000  - U+007F:   0xxxxxxx (1个字节)
U+0080  - U+07FF:   110xxxxx 10xxxxxx (2个字节)
U+0800  - U+FFFF:   1110xxxx 10xxxxxx 10xxxxxx (3个字节)
U+10000 - U+10FFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4个字节)

「中」的码点为U+4E2D,由上表可知,它属于第三行,被编码成三个字节:

4   E    2    D
0100 1110 0010 1101
-----------------------------
1110xxxx 10xxxxxx 10xxxxxx  // 上表第三行
____0100 __111000 __101101  // 将 4E2D 的二进制带入上面的格式中
-----------------------------
11100100 10111000 10101101

以上就是字符「中」经过 UTF-8 编码后得到字节序列的过程,反之亦然。

让我们来看看计算机怎么识别‘A’的

  1. 输入字符:你输入了一个字符,比如字母A
  2. 查找码点:根据Unicode标准,计算机内部有一个映射表,它会自动将这个字符转换成相应的Unicode码点U+0041
  3. 选择编码格式:决定使用哪种编码格式(如UTF-8或UTF-16)来将这个码点转换成二进制数据。
    • 如果使用UTF-8,U+0041会被转换成二进制序列01000001(即1个字节)。
    • 如果使用UTF-16,U+0041会被转换成二进制序列00000000 01000001(即2个字节)。
  1. 存储或传输:计算机现在可以处理这些二进制数据,将其存储在文件中或通过网络发送给其他计算机。现在你写的'A'就是计算机能搞懂的东西了。

那我们获取Unicode编码能干嘛?

  • 密码强度检查: 在用户注册或更改密码时,检查密码强度是一个常见的需求。你可以使用字符编码值来确定密码是否包含足够的字符类型(如大写字母、小写字母、数字和特殊字符)
  • 数据加密和解密: 我们可能需要对敏感信息(如用户名、密码)进行简单的加密或解密操作。虽然对于生产环境应该使用更安全的加密算法,但在测试或简单应用中,基于字符编码的加密可以作为一种快速解决方案。
  • 国际语言: 在构建支持多语言的Web应用程序时,我们需要确保文本能够正确显示,并且用户输入也能被正确处理。这可能涉及到不同语言字符的处理和转换。