Less中not仅在编译期静态取反原子条件,不支持函数调用、字符串误引号、类型不匹配及复合逻辑,故易失效。

Less 中的 not 不是 JavaScript 的逻辑非,它只在编译期静态取反字面量条件,且不能嵌套、不能作用于变量运算或函数调用。
为什么 not 容易失效?
常见错误是把 not 当成运行时判断:比如写 when not (lighten(@c, 10%) = #fff),这会直接报错——lighten() 在 guard 中不可用;又或者写 when not (@size = "small"),加了引号就变成字符串,而 small 是无引号关键字,类型不匹配,整个 guard 永远不成立。
-
not只能包裹一个原子条件,不支持not (@a > 5 and @b 这类复合表达式 - 它不能否定函数调用、算术结果或插值,只能否定
=、>、isnumber()等编译器可静态求值的表达式 - 写成
when not (@x)仅当@x是明确的false或0或未定义时才为真;但@x: 1px或@x: #000都会被视为“真”,not后仍为假
not 的合法使用场景
真正能用 not 的地方非常有限,集中在类型判断和简单字面量比较:
-
when not (isnumber(@n))—— 确保参数不是数字(比如传入auto或inherit) -
when not (@theme = dark)—— 排除dark关键字,其余如light、default都匹配 -
when not (@z >= 0)—— 等价于@z ,但只适用于纯数字参数 - 配合兜底 mixin 使用:
.btn(@s) when not (@s = small), not (@s = large)❌ 错误(逗号是 or 语义,不是 and);正确写法是.btn(@s) when not (@s = small) and not (@s = large)
替代 not 的更可靠写法
多数时候,显式枚举比依赖 not 更安全、更易读:
- 不要写
when not (@mode = primary)来覆盖非 primary 情况,而是定义.btn(@mode) when (@mode = secondary)和.btn(@mode) when (@mode = tertiary),再加一个无when的兜底分支 - 对布尔类控制,直接用
true/false关键字:.icon(@show) when (@show = true)+.icon(@show) when (@show = false),比not更直观 - 需要“默认行为”时,把无
when的 mixin 放在最后——它总会被匹配,相当于 else 分支
最常被忽略的一点:guard 匹配是**顺序优先**的,not 写在前面反而可能拦截掉本该由后面分支处理的情况。与其纠结 not 的边界,不如用多个明确的 when 分支 + 兜底,让逻辑落在编译器能稳定推断的范围内。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











