JavaScript 的双位非运算(~~)

今天介绍JavaScript中双位非运算 ~~, ~~ 操作符是一个强大且经常被忽视的特性。它提供了一种快速、简洁的方式来处理数字和执行类型转换,通常可以被用于数学计算和类型转换。我们先了解一下 ~~ 的基本概念和它的一些应用场景。

~~ 操作符简介

在 JavaScript 中,~~ 是双位非(bitwise NOT)操作符的双重使用。位非操作符 (~) 将其操作数的所有位进行反转(即,1 变成 0,0 变成 1)。当你连续使用两次(如 ~~),它会再次反转这些位,从而实际上返回原始值。

在给定表达式~foo的情况下,其最终的效果是-(foo + 1)。因此双位非操作~~foo将导致-(-(foo + 1) + 1)。这只适用于整数 ,给定所有可能的操作数,与~~等价的真实的表达式可能是下面这样的,但真实的内部计算肯定不是这样:

js 复制代码
typeof foo === 'number' && !isNaN(foo) && foo !== Infinity
    ? foo > 0 ? Math.floor(foo) : Math.ceil(foo) : 0;

下面是一些双位非运算的例子:

js 复制代码
~~null;      // => 0
~~undefined; // => 0
~~0;         // => 0
~~{};        // => 0
~~[];        // => 0
~~(1/0);     // => 0
~~false;     // => 0
~~true;      // => 1
~~1.2543;    // => 1
~~4.9;       // => 4
~~(-2.999);  // => -2

当你正在处理正数,~~ 的功能使其成为 Math.floor 的更好替代方案,虽然它的可读性不太好,但它速度更快且占用的字符更少。

应用场景

  1. 将浮点数转换为整数:

    • ~~ 可以用于快速将浮点数转换为整数。这种转换类似于 Math.floor(),但更简洁且在某些情况下性能更高。
    • 示例:~~4.9 结果是 4。
  2. 处理非数值:

    • 当对非数值(如字符串)使用 ~~ 时,JavaScript 会首先尝试将其转换为数字。如果转换失败,则结果为 0。
    • 示例:~~"hello" 结果是 0。
  3. 数据清洁和验证:

    • 在处理用户输入或不确定的数据时,~~ 可以确保你最终得到一个整数,或者在无法转换的情况下得到 0。
  4. 性能优化:

    • 在一些性能敏感的应用中,~~ 作为一种快速的整数转换方法,可以提供比标准方法更快的性能。

结论

~~ 运算符方法执行很快,当你执行数百万这样的操作非常适用,速度明显优于其他方法,但是代码的可读性比较差。还有一个需要要注意的地方,按位双非运算符方法仅适用于32位整数,即(2**31)-1 = 2147483647。所以对于任何高于2147483647的数字,按位运算符(~~)都会给出错误的结果,所以在这种情况下建议使用Math.floor()。


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

相关推荐
星栈20 分钟前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技23 分钟前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户479492835691543 分钟前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马3 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng4 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding5 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
johnjincaaaa5 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
鶴哥只手遮天5 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron
FungLeo7 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么8 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium