Sass 的 == 和 != 是严格等价比较,要求类型、单位、精度、内部表示完全一致,不进行隐式转换或运行时换算,因此同色不同格式(如 #007bff 与 rgb(0,123,255))、同值不同单位(20px == 20pt)、浮点精度误差(0.1+0.2==0.3)均返回 false。

为什么 Sass 的 == 和 != 在颜色/数字比较时总返回 false
因为 Sass 的 == 是严格等价(identical),不是值相等(equal)——它要求类型、单位、精度完全一致,哪怕 #007bff 和 rgb(0, 123, 255) 表示同一色值,也会判为不等。
-
color == color比较的是内部表示:十六进制、RGB、HSL 各自独立存储,blue == #00f返回false,哪怕渲染结果一样 - 带单位的数字必须单位相同:
20px == 20pt是false;2rem == 32px(在 16px 基准下)也返回false,Sass 不做运行时换算 - 浮点精度差异会暴露:
0.1 + 0.2 == 0.3返回false,因为底层是 IEEE 754 表示,0.30000000000000004 != 0.3 - 字符串比较区分大小写和空格:
"foo" == "Foo"→false;" a" == "a"→false
@if 里用 $var == null 判断变量是否未定义?
不行。== null 只能判断变量值是否为 null,但无法捕获“未定义”状态——Sass 编译器会在变量未声明时直接报错 Undefined variable,根本走不到 @if 分支。
- 正确做法是用
variable-exists($name)函数:@if variable-exists(primary-color) { ... } -
variable-exists()接收字符串参数,不解析变量本身,所以安全;meta.variable-exists("primary-color")是等效写法(需@use "sass:meta") - 别写
@if $primary-color == null—— 如果$primary-color根本没声明,编译直接中断,不会进入@if - 若变量已声明但值设为
null(如$color: null;),此时$color == null才有效
为什么 map-get($map, key) == null 总是 false 即使 key 不存在
map-get() 在 key 不存在时返回 null,但你写的 == null 很可能被 Sass 解析成两个独立 token:map-get($map, key) == + null,后者被当作未声明变量报错;或者因空格缺失导致语法错误。
- 正确写法必须加括号:
(map-get($map, key) == null),否则优先级混乱 - 更稳妥的写法是
not map-has-key($map, key),语义清晰且无歧义 - 如果 map 值本身可能是
null(比如显式存了null),那就得用map-has-key()+map-get()组合判断 - 别依赖
map-get($m, k) == false或== ""来判断缺失——Sass 不会把null自动转成布尔或空字符串
混合单位参与比较时为何结果不可靠
Sass 允许不同单位相加(如 10px + 1em),但比较操作符(==, )不自动归一化单位,而是按原始类型逐字段比对,结果取决于内部存储格式而非视觉等价性。
立即学习“前端免费学习笔记(深入)”;
-
10px == 0.625rem(在 16px 基准下)→false,因为一个是px类型,一个是rem类型 -
1in == 96px→false,尽管 CSS 规范定义 1in = 96px,但 Sass 不执行该换算 - 想安全比较,必须显式转换:
10px == (0.625rem * 16px / 1rem)(前提是1rem已知为16px) - 实际项目中,建议统一单位(全用
rem或全用px),避免跨单位比较
真正容易被忽略的是:Sass 的比较逻辑是编译期静态分析,不是运行时计算。它不关心最终 CSS 是否渲染一致,只认字面结构。你在 DevTools 里看到两个颜色一样,不代表 Sass 认为它们相等——这和 JS 的 === 类似,但约束更严。


















