【创作赢红包】喂,鬼仔,你还在瞒着我偷偷使用强制相等

我们都知道JavaScript有== (强制相等)和===(严格相等)运算符进行比较。但你可能不知道它们两个究竟有什么不同,并且更重要的是,在 js 引擎中使用它们的时候发生了什么?

前面我们提到 == 是强制比较。强制意味着 VM 试图将进行比较的双方强制为相同的类型然后查看它们是否相等。以下我们列举了一些自动被强制相等的例子:

"1" == 1 // true
1 == "1" // true
true == 1 // true
1 == true // true
[1] == 1 // true
1 == [1] // true

你要知道,强制是对称的,如果a == b为真,那么b == a也为真。另一方面,只有当两个操作数完全相同时===才为真(除了Number.NaN)。因此,上面的例子都真实的情况下都是假真 (即,在 === 的情况下是 false 的)。

为什么强制相等有这样的问题,这要归咎与强制相等的规则。

强制相等的规则

实际的规则很复杂(这也是不使用==的原因)。但是为了显示规则有多么复杂,我通过使用===实现了==,带大家看看强制相等的规则到底多复杂:

function doubleEqual(a, b) {if (typeof a === typeof b) return a === b;if (wantsCoercion(a) && isCoercable(b)) {b = b.valueOf();} else if (wantsCoercion(b) && isCoercable(a)) {const temp = a.valueOf();a = b;b = temp;}if (a === b) return true;switch (typeof a) {case "string":if (b === true) return a === "1" || a === 1;if (b === false) return a === "0" || a === 0 || a == "";if (a === "" && b === 0) return true;return a === String(b);case "boolean":if (a === true) return b === 1 || String(b) === "1";else return b === false || String(b) === "0" || String(b) === "";case "number":if (a === 0 && b === false) return true;if (a === 1 && b === true) return true;return a === Number(String(b));case "undefined":return b === undefined || b === null;case "object":if (a === null) return b === null || b === undefined;default:return false;}
}function wantsCoercion(value) {const type = typeof value;return type === "string" || type === "number" || type === "boolean";
}function isCoercable(value) {return value !== null && typeof value == "object";
}

这是不是太复杂了,我甚至不确定这是正确的! 也许有你知道更简单的算法。

但有趣的是,你会发现在上面的算法中,如果其中一个操作数是对象,VM 将调用. valueof()来允许对象将自身强制转换为基本类型。

强制转换的成本

上面的实现很复杂。那么===== 要多浪费多少性能呢? 看看下面这张图,我用基准测试做了一个对比:

在这里插入图片描述
其中,图表中越高表示越快(即,每秒操作次数越多)。

首先我们来讨论数字数组。当 VM 注意到数组是纯整数时,它将它们存储在一个称为PACKED_SMI_ELEMENTS的特殊数组中。在这种情况下,VM 知道将 == 处理为 === 是安全的,性能是相同的。这解释了为什么在数字的情况下,===== 之间没有区别。但是,一旦数组中包含了数字以外的内容,== 的情况就变得很糟糕了。

对于字符串,===== 的性能下降了 50%,看起来挺糟的是吧。

字符串在VM中是特殊的,但一旦我们涉及到对象,我们就慢了 4 倍。看看 mix 这栏,现在速度减慢了 4 倍!

但还有更糟的。对象可以定义 valueOf,这样在转换的时候可以将自己强制转换为原语。虽然在对象上定位属性可以通过内联缓存,内联缓存让属性读取变得快速,但在超大容量读取的情况下可能会经历 60 倍的减速,这可能会使情况更糟。如图中最坏情况(objectsMega)场景所示,===== 慢15 倍!

有其他使用 == 的理由吗

现在,=== 非常快! 因此,即使是使用 === 的15倍减速,在大多数应用程序中也不会有太大区别。尽管如此,我还是很难想出为什么要使用 == 而不是 === 的任何理由。强制规则很复杂,而且它存在一个性能瓶颈,所以在使用 == 之前请三思。

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

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

相关文章

程序员在晚上才敢偷偷看的10个网站,建议私藏!

这10个网站,大家自己看看就好,千万不要到处传播,因为访问的人太多了,网站可能会挂,这样我就不能拥有快乐了,salute! 搜索工具类:Goobe 别再傻傻用Google和百度了,goobe…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录 情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明💨开抢过程💥Get_cookie.py开抢 结束语😱 情况紧急 ⁉️ 不管你信不信,这就是俺刚瞧出的代码!!! 现在离20:00还有38分钟&…

中国科学院大学计算机在职博士招生,中国科学院在职博士研究生如何报考?

中国科学院大学博士研究生招收的学术型博士学位研究生,旨在培养德智体全面发展,在本学科领域掌握坚实宽广的基础理论和系统深入的专门知识,具有独立从事科学研究及相关工作的能力,能在科学研究和专门技术等方面做出创造性成果的高…

大学论文的研究框架是什么?

第一次写论文,难免连论文的基本固定结构都不得而知,更别提论文内容的研究框架啦!这一篇是论文基础知识的扫盲!告诉你一个论文的基本框架与如何树立起自己选题的内容研究框架~本篇干货满满,如果你还不会写论文&#xff…

巴比特 | 元宇宙每日必读:Meta开源AI模型ImageBind,可横跨6种模态,同时处理6种感官数据,元宇宙建设将更进一步...

摘要:据《科创板日报》报道,当地时间5月9日,Meta宣布开源了一种可以横跨6种不同模态的全新AI模型ImageBind,包括视觉(图像和视频形式)、温度(红外图像)、文本、音频、深度信息、运动…

Meta提出全新参数高效微调方案,仅需一个RNN,Transformer模型GPU使用量减少84%!

近来,随着ChatGPT和GPT-4模型的不断发展,国内外互联网大厂纷纷推出了自家的大语言模型,例如谷歌的PaLM系列,MetaAI的LLaMA系列,还有国内公司和高校推出的一些大模型,例如百度的文心一言,清华的C…

计算机社团活动展望未来,2018社团展望未来演讲稿范文

2018社团展望未来演讲稿范文 我们社团展望未来,就必须坚持社团活动的创新。以下是小编要与大家分享的社团展望未来演讲稿范文,供大家参考! 社团展望未来演讲稿范文(一) 不知不觉中,我加入到社团部这个大家庭中已有半年的时间。这半年&#xf…

我的专业我做主计算机演讲稿,我的未来我做主演讲稿

我的未来我做主演讲稿 演讲稿的写法比较灵活,可以根据会议的内容、一件事事后的感想、需要等情况而有所区别。在日常生活和工作中,演讲稿应用范围愈来愈广泛,在写之前,可以先参考范文,以下是小编精心整理的我的未来我做…

计算机社团竞选优势6,关于社团竞选演讲稿汇总六篇

关于社团竞选演讲稿汇总六篇 使用正确的写作思路书写演讲稿会更加事半功倍。在我们平凡的日常里,演讲稿应用范围愈来愈广泛,大家知道演讲稿的格式吗?下面是小编为大家整理的社团竞选演讲稿6篇,供大家参考借鉴,希望可以…

Meta「分割一切」超进化版来了!检测、分割、生成一切,狂揽2k星

编|桃子 好困源|新智元 Meta的SAM「分割一切」模型刚发布,国内团队就进行了二创,打造了一个最强的零样本视觉应用Grounded-SAM,不仅能分割一切,还能检测一切,生成一切。 Meta的「分割一切」模型…

粤港澳大湾区Microsoft Build 2023 After Party - 广州站

在经历过阳春三月一大波GPT带来的AI浪潮之后,今年的Build大会尤其令人期待。本次Build大会发布了超过50个新技术,尤其是在ChatGPT中支持Bing插件来提供联机搜索、Windows Copilot加入微软Copilot大家庭,提出Copilot Stack来便于搭建您自己的C…

学会这八个技术,你离BAT大厂不远了

红人榜第七期来咯~本期干货:HTTP、本周最受关注的技术关键词TOP8,往下看吧~ 在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱。 小编根据C1认证的成长路径…

互联网大佬谁编程排第一?周鸿祎:我应该可以排到前三名

10月24日是程序员节。在这一天,360集团创始人周鸿祎在社交平台发布动态为程序员点赞。 周鸿祎表示,未来,世界是架构在软件之上,是数字化的世界,每一个程序员都承担着重要的使命,用技术为国家解决一些“卡脖…

这个 GitHub Trending 让我在腾讯会议中“换脸成”任何人!来唠唠如何上手

前言: GitHub 上又火了个项目,蛮有趣的:可以让你在 ZOOM 、腾讯会议等等软件中“换脸”成别人。自己 fork 到本地,调了一调。作者封装的已经相当好了,当然了,像我这种 CRUD 程序员 AI 小白 肯定是要调一天…

周鸿祎评互联网大佬编程能力:我可以排前三

10月24日,也是一年一度的程序员节,360集团董事长兼CEO周鸿祎在B站发布了一段视频,讲述自己最早学习编程时的经历,以及关于程序员的故事。 在互联网程序圈出身的大佬们中,谁的编程能力最高?对此,…

分割一切还不够,还要视频跟踪一切,《清明上河图》也能轻松拿下

南方科技大学郑锋团队的这项研究:Track Anything ,很好的解决了 SAM 在视频领域的短板。 本月初,Meta 发布「分割一切」AI 模型(Segment Anything Model,简称 SAM),可以为任何图像或视频中的任何…

【深度学习】分割一切还不够,还要视频跟踪一切,《清明上河图》也能轻松拿下...

南方科技大学郑锋团队的这项研究:Track Anything ,很好的解决了 SAM 在视频领域的短板。 本月初,Meta 发布「分割一切」AI 模型(Segment Anything Model,简称 SAM),可以为任何图像或视频中的任何…

小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我

评语 班主任评语: 你是一个性格内向、聪明伶俐的男孩。平时能按时完成老师布置的作业,学习认真,成绩优良,做事认真。但有时自己的事情还不能自己完成,希望你以后可以独立起来,遇到问题多想办法&…

安卓APP源码和设计报告——体育馆预约系统

项目名称:体育馆体育场预约系统专业:班级:学号:姓名: 目 录 一、项目功能介绍3 二、项目运行环境3 1、开发环境3 2、运行环境3 3、是否需要联网3 三、项目配置文件及工程结构4 1、工程配置文件4 2、工程结构目…

波士顿人形机器人Atlas学会“跑酷”,身手超越大部分人类

最近,有外媒报道,波士顿动力公司发布了一则关于Atlas机器人“跑酷”的视频。 在视频中,机器人Atlas小跑单腿跳过障碍物,甚至面对前面的盒子,可以来个非常炫酷的“三连跳”,跳跃高度40厘米。 Atlas来个完美…