unquote()仅移除字符串首尾引号,不处理内部引号;用于伪元素content时需配合反斜杠Unicode且不可依赖其补全转义,日常推荐#{}插值替代。

unquote() 只能去掉首尾引号,中间的引号原样保留
很多人以为 unquote() 是“去引号全量清洗”,实际它只作用于字符串最外层的单引号或双引号。比如 unquote("'Hello World!'") 得到 Hello World!,但 unquote("I'm a developer") 输出仍是 I'm a developer——中间那个单引号毫发无损。
这在伪元素 content 场景里特别关键:浏览器要求某些值(如图标 Unicode、自定义标识符)必须是无引号的原始文本,否则解析失败或显示为字面量。
- ✅ 正确:
content: unquote("e901");→ 编译为content: e901;(可被字体引擎识别) - ❌ 错误:
content: "e901";→ 编译为content: "e901";(纯文本,不触发图标渲染) - ⚠️ 注意:
unquote("url('data:image/svg+xml,...')")不会帮你修复内部引号,反而可能破坏语法结构
和 quote() 配合使用时,注意引号类型强制转换
quote() 总是返回双引号包裹的字符串,不管输入用的是单引号还是没引号。这意味着它和 unquote() 并非严格互逆:
-
unquote(quote("foo"))→foo(正常往返) -
unquote(quote('foo'))→foo(单引号输入也被转成双引号再剥掉) -
unquote(quote(foo))→foo(无引号输入先被加双引号,再剥掉)
所以别指望靠 unquote(quote($x)) 来“标准化字符串”——它只确保输出无引号,不保证内容一致性。真正需要动态拼接带空格或撇号的 content 值时,优先用变量插值:content: #{$my-string};,而非套函数。
立即学习“前端免费学习笔记(深入)”;
伪元素 content 中处理图标编码,unquote() 是必要但不充分条件
Unicode 图标(如 e901)必须满足两个硬性条件才能生效:一是开头必须有反斜杠,二是不能被任何引号包裹。而 unquote() 只解决第二个问题。
- ✅ 正确写法:
$icon-home: e901; .home::before { content: unquote($icon-home); } - ❌ 错误写法:
$icon-home: "\e901"; ... unquote($icon-home)→ 输出e901(双反斜杠变成字面量) - ❌ 错误写法:
$icon-home: "e901"; ... unquote($icon-home)→ 输出e901(缺反斜杠,无效)
关键点在于:Sass 变量存储 Unicode 时,e901 必须**不加引号、不加额外转义**;unquote() 只是最后一步“脱壳”,不是“补反斜杠”或“解码”。漏掉反斜杠,编译后就是普通字符串,浏览器根本不会当 Unicode 处理。
替代方案:多数场景下,#{} 插值比 unquote() 更直接可靠
除非你在写混合函数或动态生成变量名,否则日常开发中 unquote() 几乎可以被 #{$var} 替代,而且更安全:
-
content: #{$my-unicode};—— 直接注入,不经过字符串函数链,避免多层引号干扰 -
content: unquote($my-unicode);—— 要求 $my-unicode 本身是字符串字面量且带引号,稍有不慎就编译报错 - 遇到
@each遍历 map 生成 icon class 时,#{$key}比unquote($key)更少出错,因为 map key 默认就是无引号标识符
真正绕不开 unquote() 的情况极少,典型如:你必须把一个带引号的字符串变量传给另一个函数(比如 str-slice()),而该函数拒绝接收带引号输入——这时才需要它兜底。其他时候,插值即正义。


















