jsesc

中文文档
3.1.0发布于 2024/12/11MITCommonJS零依赖近 30 天下载 7.3亿

给定一些数据,jsesc返回该数据的最短字符串化和ascii安全表示形式。

中文使用文档
文档目录8 节
  1. 安装
  2. API
  3. jsesc(value, options)
  4. jsesc.version
  5. 使用 jsesc 二进制
  6. 支持
  7. 作者
  8. 许可证

jsesc

给定一些数据, jsesc 返回该数据的字符串化表示形式。耶稣类似于 JSON.stringify() 除了:

  1. 它输出JavaScript而不是JSON 默认情况下支持ES6地图和集合等数据结构;
  2. 它提供了 许多选项 自定义输出;
  3. 它的输出是ascii安全的 默认情况下,这要归功于它的用法 转义序列 在需要的地方。

对于任何输入,jsesc生成尽可能短的有效的仅限可打印ascii的输出。 这是一个在线演示。

可以使用Jsesc的输出来代替 JSON.stringify要避免的 mojibake 和其他编码问题,甚至 避免错误 当传递json格式的数据时(可能包含U+2028 LINE SEPARATOR, U+2029 PARAGRAPH SEPARATOR,或 孤独的代理人)到JavaScript解析器或UTF-8编码器。

安装

通过 npm:

npm install jsesc

在 node . js:

const jsesc = require('jsesc');

API

jsesc(value, options)

此函数接受一个值并返回该值的转义版本,其中任何不可打印的ASCII符号都使用尽可能短的(但有效的)转义。 用于JavaScript字符串的转义序列。第一个支持的值类型是字符串:

jsesc('Ich ♥ Bücher');
// → 'Ich \\u2665 B\\xFCcher'

jsesc('foo 𝌆 bar');
// → 'foo \\uD834\\uDF06 bar'

不是字符串,而是 value 也可以是数组、对象、映射、集合或缓冲区。在这种情况下, jsesc 返回值的字符串化版本,其中非可打印ASCII符号的任何字符都以相同的方式转义。

// Escaping an array
jsesc([
  'Ich ♥ Bücher', 'foo 𝌆 bar'
]);
// → '[\'Ich \\u2665 B\\xFCcher\',\'foo \\uD834\\uDF06 bar\']'

// Escaping an object
jsesc({
  'Ich ♥ Bücher': 'foo 𝌆 bar'
});
// → '{\'Ich \\u2665 B\\xFCcher\':\'foo \\uD834\\uDF06 bar\'}'

可选 options 参数接受一个具有以下选项的对象:

quotes

的默认值 quotes 选择是 'single'。这意味着任何发生 ' 在输入字符串中被转义为 \',以便输出可以在用单引号包装的字符串文本中使用。

jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.');
// → 'Lorem ipsum "dolor" sit \\\'amet\\\' etc.'

jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
  'quotes': 'single'
});
// → '`Lorem` ipsum "dolor" sit \\\'amet\\\' etc.'
// → "`Lorem` ipsum \"dolor\" sit \\'amet\\' etc."

如果您希望将输出作为用双引号括起来的字符串文本的一部分,请设置 quotes 选项 'double'。

jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
  'quotes': 'double'
});
// → '`Lorem` ipsum \\"dolor\\" sit \'amet\' etc.'
// → "`Lorem` ipsum \\\"dolor\\\" sit 'amet' etc."

如果你想使用输出作为模板文字的一部分(即用反引号括起来),设置 quotes 选项 'backtick'。

jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
  'quotes': 'backtick'
});
// → '\\`Lorem\\` ipsum "dolor" sit \'amet\' etc.'
// → "\\`Lorem\\` ipsum \"dolor\" sit 'amet' etc."
// → `\\\`Lorem\\\` ipsum "dolor" sit 'amet' etc.`

这个设置也会影响数组和对象的输出:

jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
  'quotes': 'double'
});
// → '{"Ich \\u2665 B\\xFCcher":"foo \\uD834\\uDF06 bar"}'

jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
  'quotes': 'double'
});
// → '["Ich \\u2665 B\\xFCcher","foo \\uD834\\uDF06 bar"]'

numbers

的默认值 numbers 选择是 'decimal'。这意味着任何数值都使用十进制整数字面值表示。其他有效的选项包括 binary, octal, hexadecimal,分别产生二进制整数字面值、八进制整数字面值和十六进制整数字面值。

jsesc(42, {
  'numbers': 'binary'
});
// → '0b101010'

jsesc(42, {
  'numbers': 'octal'
});
// → '0o52'

jsesc(42, {
  'numbers': 'decimal'
});
// → '42'

jsesc(42, {
  'numbers': 'hexadecimal'
});
// → '0x2A'

wrap

这个 wrap 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出是用引号括起来的有效JavaScript字符串。参数指定引号的类型 quotes 设置。

jsesc('Lorem ipsum "dolor" sit \'amet\' etc.', {
  'quotes': 'single',
  'wrap': true
});
// → '\'Lorem ipsum "dolor" sit \\\'amet\\\' etc.\''
// → "\'Lorem ipsum \"dolor\" sit \\\'amet\\\' etc.\'"

jsesc('Lorem ipsum "dolor" sit \'amet\' etc.', {
  'quotes': 'double',
  'wrap': true
});
// → '"Lorem ipsum \\"dolor\\" sit \'amet\' etc."'
// → "\"Lorem ipsum \\\"dolor\\\" sit \'amet\' etc.\""

es6

这个 es6 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输入中的任何星形Unicode符号都将使用 ECMAScript 6 Unicode码点转义序列 而不是为每个代理部分使用单独的转义序列。如果您担心与ES5环境的向后兼容性,请不要启用此设置。如果 json 设置为启用时,值为 es6 设置被忽略(就像它被忽略一样) false).

// By default, the `es6` option is disabled:
jsesc('foo 𝌆 bar 💩 baz');
// → 'foo \\uD834\\uDF06 bar \\uD83D\\uDCA9 baz'

// To explicitly disable it:
jsesc('foo 𝌆 bar 💩 baz', {
  'es6': false
});
// → 'foo \\uD834\\uDF06 bar \\uD83D\\uDCA9 baz'

// To enable it:
jsesc('foo 𝌆 bar 💩 baz', {
  'es6': true
});
// → 'foo \\u{1D306} bar \\u{1F4A9} baz'

escapeEverything

这个 escapeEverything 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出中的所有符号都被转义——甚至包括可打印的ASCII符号。

jsesc('lolwat"foo\'bar', {
  'escapeEverything': true
});
// → '\\x6C\\x6F\\x6C\\x77\\x61\\x74\\"\\x66\\x6F\\x6F\\\'\\x62\\x61\\x72'
// → "\\x6C\\x6F\\x6C\\x77\\x61\\x74\\\"\\x66\\x6F\\x6F\\'\\x62\\x61\\x72"

此设置还会影响数组和对象中字符串字面值的输出。

minimal

这个 minimal 选项接受布尔值(true 或 false),默认为 false (禁用)。当启用时,输出中只有一组有限的符号被转义:

  • U + 0000 \0
  • U + 0008 \b
  • U + 0009 \t
  • U + 000 \n
  • U + 000 c \f
  • U + 000 d \r
  • U + 005 c \\
  • U + 2028 \u2028
  • U + 2029 \u2029
  • 用于包装字符串字面值的任何符号(基于 这个 quotes 选项)
  • 孤独的代理人

注意:启用此选项后,jsesc输出不再保证是ascii安全的。

jsesc('foo\u2029bar\nbaz©qux𝌆flops', {
  'minimal': false
});
// → 'foo\\u2029bar\\nbaz©qux𝌆flops'

isScriptContext

这个 isScriptContext 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,会出现 </script 和 </style 在输出中被转义为 <\/script 和 <\/style, <!-- 被转义为 \x3C!-- (或 \u003C!-- 当 json 选项已启用)。当jsesc的输出最终作为a的一部分时,此设置非常有用 <script> 或 <style> 元素在HTML文档中。

jsesc('foo</script>bar', {
  'isScriptContext': true
});
// → 'foo<\\/script>bar'

compact

这个 compact 选项接受布尔值(true 或 false),默认为 true (使)。启用后,数组和对象的输出尽可能紧凑;格式不太好。

jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
  'compact': true // this is the default
});
// → '{\'Ich \u2665 B\xFCcher\':\'foo \uD834\uDF06 bar\'}'

jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
  'compact': false
});
// → '{\n\t\'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'

jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
  'compact': false
});
// → '[\n\t\'Ich \u2665 B\xFCcher\',\n\t\'foo \uD834\uDF06 bar\'\n]'

此设置对字符串的输出没有影响。

indent

这个 indent 选项接受字符串值,默认值为 '\t'。当 compact 设置已禁用(false的值 indent 选项用于格式化数组和对象的输出。

jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
  'compact': false,
  'indent': '\t' // this is the default
});
// → '{\n\t\'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'

jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
  'compact': false,
  'indent': '  '
});
// → '{\n  \'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'

jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
  'compact': false,
  'indent': '  '
});
// → '[\n  \'Ich \u2665 B\xFCcher\',\n\  t\'foo \uD834\uDF06 bar\'\n]'

此设置对字符串的输出没有影响。

indentLevel

这个 indentLevel 选项接受一个数值,默认值为 0。它表示当前缩进级别,即值的次数 这个 indent 选项 是重复的。

jsesc(['a', 'b', 'c'], {
  'compact': false,
  'indentLevel': 1
});
// → '[\n\t\t\'a\',\n\t\t\'b\',\n\t\t\'c\'\n\t]'

jsesc(['a', 'b', 'c'], {
  'compact': false,
  'indentLevel': 2
});
// → '[\n\t\t\t\'a\',\n\t\t\t\'b\',\n\t\t\t\'c\'\n\t\t]'

json

这个 json 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出是有效的JSON。 十六进制字符转义序列 和 这个 \v 或 \0 转义序列 不使用。设置 json: true 意味着 quotes: 'double', wrap: true, es6: false尽管如果需要,仍然可以覆盖这些值——但在这种情况下,输出将不再是有效的JSON。

jsesc('foo\x00bar\xFF\uFFFDbaz', {
  'json': true
});
// → '"foo\\u0000bar\\u00FF\\uFFFDbaz"'

jsesc({ 'foo\x00bar\xFF\uFFFDbaz': 'foo\x00bar\xFF\uFFFDbaz' }, {
  'json': true
});
// → '{"foo\\u0000bar\\u00FF\\uFFFDbaz":"foo\\u0000bar\\u00FF\\uFFFDbaz"}'

jsesc([ 'foo\x00bar\xFF\uFFFDbaz', 'foo\x00bar\xFF\uFFFDbaz' ], {
  'json': true
});
// → '["foo\\u0000bar\\u00FF\\uFFFDbaz","foo\\u0000bar\\u00FF\\uFFFDbaz"]'

// Values that are acceptable in JSON but aren’t strings, arrays, or object
// literals can’t be escaped, so they’ll just be preserved:
jsesc([ 'foo\x00bar', [1, '©', { 'foo': true, 'qux': null }], 42 ], {
  'json': true
});
// → '["foo\\u0000bar",[1,"\\u00A9",{"foo":true,"qux":null}],42]'
// Values that aren’t allowed in JSON are run through `JSON.stringify()`:
jsesc([ undefined, -Infinity ], {
  'json': true
});
// → '[null,null]'

注意: 在包含非字符串值的对象或数组上使用此选项依赖于 JSON.stringify()。对于像IE≤7这样的遗留环境,使用 一个 JSON polyfill。

lowercaseHex

这个 lowercaseHex 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,转义序列中的任何十六进制字母数字以及任何十六进制整数字面值(请参阅 这个 numbers 选项)中的字符都是小写的。

jsesc('Ich ♥ Bücher', {
  'lowercaseHex': true
});
// → 'Ich \\u2665 B\\xfccher'
//                    ^^

jsesc(42, {
  'numbers': 'hexadecimal',
  'lowercaseHex': true
});
// → '0x2a'
//      ^^

jsesc.version

表示语义版本号的字符串。

使用 jsesc 二进制

要使用 jsesc 在shell中安装二进制文件,使用npm全局安装jsesc:

npm install -g jsesc

之后你就可以从命令行转义字符串了:

$ jsesc 'föo ♥ bår 𝌆 baz'
f\xF6o \u2665 b\xE5r \uD834\uDF06 baz

要转义包含字符串值的数组或对象,请使用 -o/--object 选择:

$ jsesc --object '{ "föo": "♥", "bår": "𝌆 baz" }'
{'f\xF6o':'\u2665','b\xE5r':'\uD834\uDF06 baz'}

在这种情况下,要美化输出,请使用 -p/--pretty 选择:

$ jsesc --pretty '{ "föo": "♥", "bår": "𝌆 baz" }'
{
  'f\xF6o': '\u2665',
  'b\xE5r': '\uD834\uDF06 baz'
}

对于有效的JSON输出,使用 -j/--json 选择:

$ jsesc --json --pretty '{ "föo": "♥", "bår": "𝌆 baz" }'
{
  "f\u00F6o": "\u2665",
  "b\u00E5r": "\uD834\uDF06 baz"
}

读取本地JSON文件,转义任何非ascii符号,并将结果保存到新文件:

$ jsesc --json --object < data-raw.json > data-escaped.json

或者对在线JSON文件做同样的事情:

$ curl -sL "http://git.io/aorKgQ" | jsesc --json --object > data-escaped.json

看到 jsesc --help 以获取完整的选项列表。

支持

从v3.0.0开始,jsesc只支持Node.js v6+。

旧版本(jsesc v1.3.0之前)支持Chrome 27、Firefox 3、Safari 4、Opera 10、IE 6、Node.js v6.0.0、Narwhal 0.3.2、ringgojs 0.8-0.11、PhantomJS 1.9.0和Rhino 1.7RC4。 注意: 使用 json 对象或数组中包含非字符串值的选项 JSON.parse()。对于像IE≤7这样的遗留环境,使用 一个 JSON polyfill。

作者

twitter/mathias
马赛厄斯Bynens

许可证

这个图书馆可以在 麻省理工学院 许可证。

版本与发布记录

jsesc 共发布 23 个版本,首次发布于 2013/07/27;过去 12 个月发布了 0 个版本。

版本发布日期距今
3.1.0latest2024/12/111.9 年前
3.0.22020/10/286 年前
3.0.12020/04/106 年前
3.0.02020/04/086 年前
2.5.22018/11/097 年前
2.5.12017/05/059 年前

关于 jsesc 的常见问题

jsesc 是什么?

给定一些数据,jsesc返回该数据的最短字符串化和ascii安全表示形式。

如何安装 jsesc?

在项目目录运行 npm install jsesc,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 jsesc,可以用 npx jsesc 直接运行。

jsesc 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/jsesc 是否存在。

jsesc 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

jsesc 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=6。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

jsesc 可以商用吗?

jsesc 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

jsesc 的下载量有多少?

根据 npm 官方下载统计,jsesc 在 2026/10/05 – 2026/11/03 这 30 天内被下载 733,527,831 次,日均约 24,450,928 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

jsesc 还在维护吗?

最新版本 3.1.0 发布于 2024/12/11(1.9 年前);至今共发布 23 个版本,其中过去 12 个月发布了 0 个;首次发布于 2013/07/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。