快速的取整方法(~~)

为什么80%的码农都做不了架构师?>>>   hot3.png

最近看一篇js装逼小技巧————双波浪号的妙用(将内容转化为数字,或者小数取整),但是本身我的JavaScript水平比较低对其底层操作和其使用范围不甚了解;通过翻阅资料现进行简单的整理。 ###装逼技巧地址&截图### 地址

图片

###~~的本质### ~~被称为“双按位非”操作符。你通常可以使用它作为代替Math.trunc()的更快的方法。 一个按位非操作符~首先将输入input截取为32位,然后将其转换为-(input+1)。因此双按位非操作符将输入转换为-(-(input + 1)+1),使其成为一个趋向于0取整的好工具。对于数字的输入,它很像Math.trunc()。失败时返回0,这可能在解决Math.trunc()转换错误返回NaN时是一个很好的替代。

// 单个 ~
console.log(~1337)// -1338
// 数字输入
console.log(~~47.11)  // -> 47
console.`log`(~~1.9999) // -> 1
console.log(~~3)  // -> 3

然而, 尽管~~可能有更好的性能,有经验的程序员通常坚持使用Math.trunc()。要明白为什么,这里有一个关于此操作符的分析。 ###适用的情况### 当CPU资源很珍贵时

~~可能在各平台上都比Math.trunc()快,但是你应该在你所关心的所有平台上测试这种猜想。同样,你通常需要执行数百万这样的操作来看看在运行时有没有明显的影响。

当不需要关心代码清晰度时

如果你想迷惑其他人,或者想在minifier/uglifier时取得更大功效,这是一种相对廉价的方式。 ###禁用的情况### 当你的代码需要维护时

代码可读性始终是最重要的。无论你工作在一个团队,或是贡献给开源仓库,或是单飞。

当你忘记~~永远趋向于0时

新手程序员或许更关注~~的聪明之处,却忘记了“只去掉小数部分”的意义。这在将浮点数转换为数组索引或关联有序的值时很容易导致差一错误 ,这时明显需要一个不同的取整方法。 (代码可读性不高往往会导致此问题)

打个比方,如果你想得到离一个数“最近的整数”,你应该用Math.round()而不是~~,但是由于程序员的惰性和每次使用需要敲10个键的事实,人类的手指往往会战胜冷冷的逻辑,导致错误的结果。

相比之下,Math.xyz()(举例)函数的名字清楚的传达了它们的作用,减少了可能出现的意外的错误。

当处理大数时

因为~首先将数组转换为32位,~~的结果伪值在 ±2.15*10^12左右。如果你没有明确的检查输入值的范围,当转换的值最终与原始值有很大差距时,用户就可能触发未知的行为:

a = 2147483647.123  // 比32位最大正数,再多一点
console.log(~~a)// ->  2147483647 (ok)
a += 10000  // ->  2147493647.123 (ok)
console.log(~~a)// -> -2147483648 (huh?)

一个特别容易中招的地方是在处理Unix时间戳时(从1970年1月1日 00:00:00 UTC开始以秒测量)。一个快速获取的方法:

epoch_int = ~~(+new Date() / 1000) // Date() 以毫秒计量,所以我们缩小它 然而,当处理2038年1月19日 03:14:07 UTC 之后的时间戳时(有时称为Y2038 limit), 可怕的事情发生了:

// 2040年1月1日 00:00:00.123 UTC的时间戳
epoch = +new Date('2040-01-01') / 1000 + 0.123  // ->  2208988800.123
// 回到未来!
epoch_int = ~~epoch // -> -2085978496
console.log(new Date(epoch_int * 1000)) // ->  Wed Nov 25 1903 17:31:44 UTC

// 这很搞笑,让我们来取得正确结论

epoch_flr = Math.floor(epoch)   // ->  2208988800
console.log(new Date(epoch_flr * 1000)) // ->  Sun Jan 01 2040 00:00:00 UTC

当原始输入的数据类型不确定时

因为~~可以将任何非数字类型转换为0:

console.log(~~[])   // -> 0
console.log(~~NaN)  // -> 0
console.log(~~null) // -> 0

一些程序员将其看作适当输入验证的替代品。然而,这将导致奇怪的逻辑问题,因此你不能辨别违法输入还是真正的0。因此这并不推荐。 当很多人认为~~X == Math.floor(X)时

很多人由于很多原因错误的把”双按位非”等同于Math.floor()。如果你不能准确地使用它,最终你很有可能会滥用它。

另一些人很细心的注意正数使用Math.floor()而负数使用Math.ceil(),但这又强制你在处理它的时候需要停下来想一想你处理的数是什么值。这又违背了使用~~快捷无陷阱的目的。

###结论###

  1. 谨慎使用。
  2. 在应用前检查值。
  3. 仔细记录被转化值的相关假设。
  4. 审查代码至少处理:
  • 逻辑错误,不合法的输入作为合法的0传入其他代码模块
  • 输入转换后范围错误
  • 错误的舍入方向导致差一错误

转载于:https://my.oschina.net/bbhan/blog/1498466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git log友好显示

查看commit 提交日志 $ git log $git log --prettyoneline $git reflog 显示所有提交记录,包括已经回退的提交,如图:提交了abc 和 bb 然后回退到 abc   $git log 只显示abc提交 可以使用 $git reset --hard commit号 回退到bb git reflog…

南理工计算机技术专业学位,南京理工大学计算机技术(专业学位)考研难吗

很多考生在准备南京理工大学计算机技术(专业学位)考研难吗?是考研报考的时候都会产生这样的疑问:这个专业的研究生好吗?适合我吗?对我以后的人生和职业会有帮助吗?考生在准备南京理工大学计算机技术(专业学位)专业考研…

《分布式系统:概念与设计》一2.3.2 体系结构模式

2.3.2 体系结构模式 体系结构模式构建在上述讨论过的相对原始的体系结构元素之上,提供组合的、重复出现的结构,这些结构在给定的环境中能运行良好。它们未必是完整的解决方案,但当与其他模式组合时,它们会更好地引导设计者给出一…

javascript sort()实现元素json对象的排序

看以下代码: var s [ { name: "Robin Van PurseStrings", age: 30 } ,{ name: "Theo Walcott", age: 24 } ,{ name: "Bacary Sagna", age: 28 } ].sort(function(obj1, obj2) {// 实现增序排列:前者的 age 小于后者…

调查:Java程序员最伤心,C++程序员最年老

说起我们对编程世界现有的刻板印象,你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家,等等这样的话。为了分析这些刻板印象背后的真相,Trestle Technology的数据工程师写了一个工具。 不知道你有没有听说过微软的Project Oxford&…

计算机不小心删除怎么找回桌面,如何将桌面上误删的文件找回

在如今工作电脑化的趋势下,用户都会在桌面上创建各种各样的文件等,这些文件都是需要在工作中经常要进行各种操作的重要文件,那么频繁的操作也会出现各种的意外情况等,如果不小心删除了重要的文件该怎么恢复呢?想要恢复…

OnClickListener冲突的问题

OnClickListener冲突的问题 (2011-11-26 15:28:27) 转载▼标签: 杂谈 分类: android学习记录 import anfroid.view.View.OnClickListenerimport anfroid.content.DialogInterface.OnClickListener 这两个东西要同时用的话,要使用以下方式&…

html 响应式 同一行,一行CSS实现各种响应式元素 – Fluidity

一行CSS实现各种响应式元素 – Fluidity3月 31, 2014评论SponsorFLUIDITY是一个极微小的CSS样式表,压缩版只有一行代码,大小只有115个字节,它能实现图像、文本、Canvas、Table表格以及iFrame框架的响应式功能。好用且实用!这个响应…

玩C一定用得到的19款Java开源Web爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 今天将为…

一元二次方程

转载于:https://www.cnblogs.com/569114a/p/4179164.html

数据中心存在不当投资吗?

不正当的投资是一种危害:在一些项目建设中,投入大量的资金是错误的,因为这些项目的需求是不可持续的或高估的。那么数据中心属于这一类吗? 投资不当的问题 不当投资会与经济的繁荣与萧条齐头并进。例如,抑制按揭贷款利率可能会导…

html如何设置滚动动画,JavaScript 实现页面滚动动画

在做前端 UI 效果时,让元素根据滚动位置实现动画效果是一个非常流行的设计,通常我们会使用第三方插件或库来实现。在本教程中,我将教大家使用纯 JavaScript 和 CSS 来实现。先预览一下实现的效果:我们使用 CSS 来实现动画&#xf…

绝非玩笑!人工智能或开创黑客新时代

专家称,未来的网络战争可能是机器对机器,这可能需要几年甚至几十年时间,但黑客并不一定总是人类。人工智能(AI)是可彻底改变网络安全的技术,而它有一天可能成为最终的攻击工具。 今年8月由美国国防部先进项目研究局(DARPA)赞助的C…

自学python系列14:映像,集合类型-集合类型

集合类型1.1如何创建集合类型和给集合赋值1.1.1 如何创建集合类型和给集合赋值集合的工厂方法set()和frozenset()>>> sset(abc)>>> sset([a, c, b])>>> tfrozenset(abc)>>> tfrozenset([a, c, b])len()计算的是集合的字母的个数1.1.2如何访…

观点:我们为什么需要威胁情报?

最近被谈论的异常火热的一个术语就是威胁情报,那么威胁情报到底是什么意思,它是一种什么概念或者机制呢?本文中我们就来亲密接触一下威胁情报,并了解它所具有的功能,然后给出几个威胁情报的最佳实践示例,最后分析威胁…

vijos 1942 [AH 2005] 小岛

描述 西伯利亚北部的寒地,坐落着由 N 个小岛组成的岛屿群,我们把这些小岛依次编号为 1 到 N 。 起初,岛屿之间没有任何的航线。后来随着交通的发展,逐渐出现了一些连通两座小岛的航线。例如增加一条在 u 号小岛与 v 号小岛之间的航…

聊城大学计算机应用基础函授,聊城大学试题计算机应用基础试题

姓名 年级专业层次 教学单位密封线 第1页 共3页聊城大学《计算机应用基础》函授试题一、判断题(共10题,每题2分,共20分)1、信息按状态划分可以划分为动态信息和静态信息。( √ )2、操作系统不具有通用性。( )3、在Windows XP环境中,整个显示…

(七)SpringBoot+SpringCloud —— 集成断路器

2019独角兽企业重金招聘Python工程师标准>>> 断路器简介 在一个项目中,系统可能被拆分成多个服务,例如用户、订单和库存等。 这里存在这服务调用服务的情况,例如,客户端调用订单服务,订单服务又调用库存服务…

计算机学业水平考试及格,信息技术学业水平考试表格部分试题(带答案)

第三章表格信息的加工与表达复习学案【学习目标】1.熟练使用excel加工表格信息,理解用图表来表现信息的特点与意义,2.能根据表格数据关系选择合适的图表类型表达意图。【考点】1.表格中常用的函数及其求值方法;2.根据数据选择合适的图表类型&…

云计算:容器技术变革云计算,SaaS带动CaaS市场

报告摘要: 1、容器技术增速惊人,市场认可度提高 虚拟化是云计算的重要基础,Docker定义了一套容器从构建到执行的标准化体系,改变了传统的虚拟化技术,深度影响了云计算领域。 随着谷歌、亚马逊、微软等云计算厂商纷纷加…