JavaScript 里的 !0、!1 到底是啥?聊聊那些压缩器最爱的“极简写法”

在阅读 JavaScript 源码,尤其是压缩后的代码时,很多人常常会遇到这样的片段:

scss 复制代码
if (!0) { /* ... */ }  // 等价于 if (true)
if (!1) { /* ... */ }  // 等价于 if (false)

这些诡异的语法你可能一开始会觉得费解,但其实是压缩器(比如 UglifyJS、Terser)为了追求 最小体积和最高性能 的结果。

这一类代码就是所谓的 JavaScript 压缩写法。它们压缩得极致,同时也保持了逻辑一致性。下面我们就系统聊聊有哪些经典写法、为啥这么写、哪些能用哪些要注意。


🧱 布尔值压缩:true/false 最短写法

语义 原始写法 压缩写法 说明
true true !0 逻辑真
false false !1 逻辑假
强制转布尔值 Boolean(x) !!x 常见强转布尔写法

!!x 是最经典的布尔转型写法,用得非常广泛,比如:

ini 复制代码
const isValid = !!user.id;

🧪 undefined 与 null 的压缩技巧

意图 原始写法 压缩写法 说明
undefined 值 undefined void 0 永远返回 undefined
判断 undefined 类型 typeof x === 'undefined' typeof x == 'undefined' 双等号足够安全
判断是否为 null x === null null == x 包括 null 和 undefined

void 0 是一个冷门但安全的写法,它绕过了 undefined 可能被覆盖的问题(老浏览器或者手动重写)。


🔁 条件逻辑压缩

原始写法 压缩写法 含义
x ? true : false !!x 转换为布尔值
x ? x : y `x
x ? y : null x && y x 存在则执行 y
if (x) return true; return !!x; 简洁返回布尔

这些写法多数来自于逻辑短路的使用,既压缩代码,也提升性能(少一层判断)。


🔎 类型判断 & 替代操作符

原始写法 压缩写法 说明
typeof foo === 'function' typeof foo == 'function' 双等号更短
Array.isArray(x) x instanceof Array 兼容性略差,但更短
x !== undefined void 0 !== x 避免使用 undefined 字面量

压缩器通常偏好双等号 ,因为其字节更少。而 typeof 场景下使用双等号其实是安全的(因为不会触发类型转换)。


📦 数组与对象压缩

原始写法 压缩写法 说明
[1, 2, 3].length 3 直接写字面量节省字符
{a: a} {a} ES6 对象属性简写
obj['key'] obj.key 如果 key 合法,更短更直观

这些优化大多自动由现代压缩器处理,无需人工介入,但有助于理解源码。


📉 函数和箭头函数优化

原始写法 压缩写法 说明
function () {} ()=>{} 箭头函数更短
function(a){ return a*2 } a=>2*a 单表达式更可简写

注意,箭头函数没有 this,不要盲目替换类方法等。


🧮 数学与位运算优化

原始写法 压缩写法 说明
Math.floor(x) ~~x 双按位取反等价于 floor
Math.pow(x, 2) x * x 常数次方直接展开更快更短
parseInt(x, 10) `+x 0`

但这些写法不要轻易使用在业务代码中 ,因为会让代码可读性大幅下降


🎲 Bonus:冷门但实用的压缩技巧

原始写法 压缩写法 说明
for (let i=0; i<n; i++) for(i=n;i--;) 倒序遍历节省初始化代码
a != null null != a 可以避免 null 和 undefined
x && x.fn() x?.fn() 可选链更短,但需现代浏览器支持

✅ 写在最后:压缩写法是"写给机器的代码"

这些技巧大多来源于压缩器的优化逻辑,是写给机器看的代码

开发者日常业务中,并不推荐自己手动这么写。更推荐的是:

  • 业务代码保持可读性
  • 构建阶段交给打包工具压缩
  • 理解这些写法,能更好阅读源码、调试、做逆向
相关推荐
知识分享小能手6 小时前
微信小程序入门学习教程,从入门到精通,微信小程序常用API(上)——知识点详解 + 案例实战(4)
前端·javascript·学习·微信小程序·小程序·html5·微信开放平台
清灵xmf7 小时前
CSS field-sizing 让表单「活」起来
前端·css·field-sizing
文火冰糖的硅基工坊7 小时前
[光学原理与应用-480]:《国产检测设备对比表》
前端·人工智能·系统架构·制造·半导体·产业链
excel7 小时前
Qiankun 子应用生命周期及使用场景解析
前端
weixin_446260857 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django
蓝莓味的口香糖7 小时前
【JS】什么是单例模式
开发语言·javascript·单例模式
ObjectX前端实验室8 小时前
【react18原理探究实践】异步可中断 & 时间分片
前端·react.js
SoaringHeart8 小时前
Flutter进阶:自定义一个 json 转 model 工具
前端·flutter·dart
努力打怪升级8 小时前
Rocky Linux 8 远程管理配置指南(宿主机 VNC + KVM 虚拟机 VNC)
前端·chrome
brzhang9 小时前
AI Agent 干不好活,不是它笨,告诉你一个残忍的现实,是你给他的工具太难用了
前端·后端·架构