javascript in运算符-在 JS 中,速度更快:对象的“in”运算符还是字段的 indexof?

2023-08-23 0 8,432 百度已收录

[在 JavaScript 中,您通常会处理各种实现(除非您在受控环境中使用它,例如您选择的引擎的服务器),具体性能问题的答案通常是“这取决于您想要使用的引擎。” 实现的最快执行速度可能会更慢,具体取决于此推送。 对于这种事情非常有用。

也就是说javascript in运算,我希望实际上是这里的赢家。 Array#indexOf 必须在搜索中访问链表索引,但链表索引是一个像任何其他属性一样的属性。 为此,访问链表索引 0 以查看它是否是所需的字符串需要查找 0,另一个需要查找属性“canSummonKraken”(然后必须立即进行字符串比较)。 (是的,链表索引是属性。JavaScript 中的字段根本不是真正的数组。)indexOf 在搜索过程中可能需要访问多个属性,而 in 只需要访问一个属性。 再说一次javascript in运算,您需要在目标环境中进行测试,以确保各个实现可以优化具有连续索引范围的字段(但最慢的字段肯定不会,事实上,如果您担心速度,则不能害怕最慢的引擎(如 IE 引擎),但它们是最快的。

另请注意,并非所有 JavaScript 引擎都有 Array#indexOf。 大多数都这样做,但总有一些较旧的(我正在看着你,谷歌)不这样做。

你还有一个问题是使用in还是hasOwnProperty。 使用in的优点是它是一个运算符,而不是函数调用; 使用 hasOwnProperty 的优点是它只会查看特定的对象实例,而不是其原型(及其原型等)。 除非您有特别深的继承层次结构(但在您的示例中没有),否则我相信胜利,并且记住它确实检测层次结构是有用的。

[此外,请记住,在您显示的示例对象文字中,obj 中的“canSummonKraken”将为 true,因为该对象确实具有属性,尽管该属性的值为 null。 为什么你有属性 [[aall 能够返回 false。 (您可以只使用 true 和 false 并将其查找为 obj.canSummonKraken,而不是 in。)

所以你的选择是:你的链接列表方式:

CorporatePlan=['canDeAuthorize','hasGmailSupport','canShareReports','canSummonKraken','etc'];console.log(corporatePlan.indexOf("canSummonKraken")>=0);//trueconsole.log(corporatePlan.indexOf ("canDismissKraken")>=0);//假

...我不推荐。

在方法中:

CorporatePlan={'canDeAuthorize':null,'hasGmailSupport':null,'canShareReports':null,'canSummonKraken':null,'etc':null};console.log("canSummonKraken"incorporatePlan);//trueconsole.log( "canDismissKraken"incorporatePlan);//false

可能比indexOf快,但我会对其进行测试。如果列表可能很长,并且您将要拥有很多这样的对象,则很有用,因为它只要求“真正的”属性存在。空对象表示用户无法执行任何操作的计划,并且非常小。

我应该在这里注意两件事:

in也会检查对象的原型,因此,如果您具有toStringvalueOf之类的设置,则会得到误报(因为这些属性几乎都是从Object.prototype获得的属性) 。在启用ES5的浏览器上,可以通过使用null原型创建对象来避免该问题:var corporatePlan = Object.create(null); 也许是因为它检查原型,所以in运算符在某些引擎上

令人惊讶地缓慢

。 这两个问题都可以通过使用 hasOwnProperty 来解决:

console.log(corporatePlan.hasOwnProperty("canSummonKraken"));//trueconsole.log(corporatePlan.hasOwnProperty("canDismissKraken"));//false

一个人会认为运算符会比方法调用更快,但事实证明这并不是真正的跨浏览器。

标记方法:

CorporatePlan={'canDeAuthorize':true,'hasGmailSupport':true,'canShareReports':true,'canSummonKraken':true,'canDismissKraken':false,'etc':true};console.log(corporatePlan.canSummonKraken);/ //"true" console.log(corporatePlan.canDismissKraken);//"false"//或者使用括号符号,以防万一需要测试这个 //dynamicallyconsole.log(corporatePlan["canSummonKraken"]);//"true"console.log(corporatePlan[" canDismissKraken "]);//"false"//exampledynamiccheck:varitem;item="canSummonKraken";console.log(corporatePlan[item]);//"true"item="canDismissKraken";console.log(corporatePlan[item] ] );//“错误的”

...这将是相当正常的做法,可能比in快,并且可能至少与hasOwnProperty一样快。 (但请参见我的开头段落:在您的环境中进行测试。:-))

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript in运算符-在 JS 中,速度更快:对象的“in”运算符还是字段的 indexof? https://www.wkzy.net/game/142683.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务