JavaScript 面试题
目录

请解释 JavaScript 中的编码和解码方法,例如 encodeURI、decodeURI、encodeURIComponent、decodeURIComponent、btoa 和 atob 的作用和区别。

· 约 8 分钟读完 · 第 85 / 507 章

推荐答案

JavaScript 提供了多种编码和解码方法,用于处理字符串,尤其是 URL 和二进制数据。主要分为以下几类:

  1. URI 编码/解码 (encodeURI, decodeURI, encodeURIComponent, decodeURIComponent)

    • encodeURI(uri): 用于编码整个 URI,不会编码以下字符:A-Z a-z 0-9 ; / ? : @ & = + $ , - _ . ! ~ * ' ( ) #。主要用于编码整个 URI。
    • decodeURI(encodedURI): 用于解码由 encodeURI() 编码的 URI。
    • encodeURIComponent(uriComponent): 用于编码 URI 的组件部分,会编码以下字符:; / ? : @ & = + $ , - _ . ! ~ * ' ( ) # 以及 encodeURI() 中不会编码的字符。常用于编码 URL 的参数部分。
    • decodeURIComponent(encodedURIComponent): 用于解码由 encodeURIComponent() 编码的 URI 组件。

    区别:

    • encodeURI 用于编码完整的URI,保留了URI的结构字符。
    • encodeURIComponent 用于编码URI的组件,会编码更多的字符,包括URI结构字符,适用于URL参数。
  2. Base64 编码/解码 (btoa, atob)

    • btoa(string): 用于将字符串或二进制数据编码为 Base64 字符串。
    • atob(encodedString): 用于解码 Base64 字符串,返回原始字符串或二进制数据。

    注意: btoa() 和 atob() 主要用于处理 ASCII 字符编码,如果字符串包含非 ASCII 字符,需要先将其转换为 UTF-8 编码的字节序列,再进行 Base64 编码/解码,可以使用 TextEncoder 和 TextDecoder 实现。

本题详细解读

URI 编码和解码

URI 编码和解码是 Web 开发中常见的操作,主要用于处理 URL 中的特殊字符,确保 URL 的正确解析和传输。

  • encodeURI(uri)

    encodeURI() 方法将 URI 中的某些字符替换为由一个、两个或三个十六进制数字编码的转义序列。它旨在编码完整的 URI,并且不会编码一些保留的 URI 结构字符,例如:

    • A-Z a-z 0-9: 英文字母和数字
    • ; / ? : @ & = + $ , - _ . ! ~ * ' ( ) #: 一些 URI 结构字符

    使用场景: 主要用于编码整个 URI,例如:

  • decodeURI(encodedURI)

    decodeURI() 方法用于解码由 encodeURI() 编码的 URI,将转义序列恢复为原始字符。

  • encodeURIComponent(uriComponent)

    encodeURIComponent() 方法用于编码 URI 的组件部分,它会编码更多的字符,包括 encodeURI() 中不会编码的 URI 结构字符。

    • A-Z a-z 0-9: 英文字母和数字
    • ; / ? : @ & = + $ , - _ . ! ~ * ' ( ) #: 一些 URI 结构字符

    使用场景: 主要用于编码 URI 的组件,例如 URL 参数、路径等。

  • decodeURIComponent(encodedURIComponent)

    decodeURIComponent() 方法用于解码由 encodeURIComponent() 编码的 URI 组件。

Base64 编码和解码

Base64 是一种用 64 个字符表示任意二进制数据的编码方式。

  • btoa(string)

    btoa() 方法用于将字符串或二进制数据编码为 Base64 字符串。

    注意: btoa() 只能处理 ASCII 字符编码,如果字符串中包含非 ASCII 字符,例如中文字符,需要先进行 UTF-8 编码,然后再进行 Base64 编码。可以使用 TextEncoder 将字符串转换为 UTF-8 字节序列的 Uint8Array,然后再使用 String.fromCharCode.apply(null, uint8Array) 将 Uint8Array 转换为 ASCII 字符串。

  • atob(encodedString)

    atob() 方法用于解码 Base64 字符串,将其恢复为原始字符串。类似地,对于包含非 ASCII 字符的 Base64 编码,需要先解码为字节序列,再使用 TextDecoder 将字节序列解码为 UTF-8 字符串。