String.prototype.isWellFormed()

Baseline 2023
新推出

自 ⁨2023 年 10 月⁩ 以来,此功能已在最新设备和浏览器版本中得到支持。此功能可能无法在旧设备或浏览器上运行。

String 值的 isWellFormed() 方法返回一个布尔值,指示此字符串是否包含任何单独的代理(lone surrogates)

语法

js
isWellFormed()

参数

无。

返回值

如果此字符串不包含任何单独的代理,则返回 true,否则返回 false

描述

JavaScript 中的字符串是 UTF-16 编码的。UTF-16 编码有一个代理对(surrogate pairs)的概念,这在UTF-16 字符、Unicode 码点和字形簇部分有详细介绍。

isWellFormed() 允许您测试一个字符串是否格式良好(即,不包含任何单独的代理)。与自定义实现相比,isWellFormed() 更高效,因为引擎可以直接访问字符串的内部表示。如果您需要将字符串转换为格式良好的字符串,请使用 toWellFormed() 方法。isWellFormed() 允许您以不同于格式良好的字符串的方式处理格式不正确的字符串,例如抛出错误或将其标记为无效。

示例

使用 isWellFormed()

js
const strings = [
  // Lone leading surrogate
  "ab\uD800",
  "ab\uD800c",
  // Lone trailing surrogate
  "\uDFFFab",
  "c\uDFFFab",
  // Well-formed
  "abc",
  "ab\uD83D\uDE04c",
];

for (const str of strings) {
  console.log(str.isWellFormed());
}
// Logs:
// false
// false
// false
// false
// true
// true

避免 encodeURI() 中的错误

encodeURI 如果传入的字符串格式不正确,则会抛出错误。通过在将字符串传递给 encodeURI() 之前使用 isWellFormed() 进行测试,可以避免这种情况。

js
const illFormed = "https://example.com/search?q=\uD800";

try {
  encodeURI(illFormed);
} catch (e) {
  console.log(e); // URIError: URI malformed
}

if (illFormed.isWellFormed()) {
  console.log(encodeURI(illFormed));
} else {
  console.warn("Ill-formed strings encountered."); // Ill-formed strings encountered.
}

规范

规范
ECMAScript® 2026 语言规范
# sec-string.prototype.iswellformed

浏览器兼容性

另见