在性能方面,Object.constructor()与Join的存在

Object.constructor() vs Presence of Join in terms of performance

本文关键字:Join 存在 constructor 性能 方面 Object      更新时间:2023-09-26

我一直在阅读这个线程,以检查参数是Array还是String

检查对象是否为数组?

提到的解决方案是:

function isArray(obj){
    return !!obj && Array === obj.constructor;
}

但我已经写了以下函数

function isArray(obj) {
     return obj.join;
}

我做了一些样品测试。我正在查找array.join((返回的结果比object.constructor((更快。我是不是遗漏了什么?

我认为Object.constructor((是父类,因此速度更快,但我可以使用obj.split返回更快的结果。这是否意味着其他SO帖子中的答案不正确

Jsfidle:

https://jsfiddle.net/vdpseotp/6/

请解释。

使用obj.join的方法有时被称为"鸭子类型"。如果你在一个恰好包含join属性的对象上使用join,那么按照你的建议使用它将非常失败。

只需使用为任务设计的API,如Array.isArray,或实用程序库中的例程。他们已经考虑了所有的问题。例如,Undercore使用Object.prototype.toString.call(obj) === '[object Array]'。这里也有大量关于SO的文献,从你提到的那个开始。

更基本的问题是,为什么你有东西,却不知道它们是否是数组?也许一些用于遍历任意对象的实用程序例程可能需要检查数组性,或者服务器可能会发送可能是数组也可能不是数组的东西,但设计良好的用户程序应该已经知道哪些对象是什么。换一种说法,如果你转向TypeScript这样的类型化方法,你会建议给这些方法分配什么类型——可能是数组,可能不是对象?你会用any吗?哪一种会破坏整个目的?

第二个问题是,你为什么痴迷于几微秒?你有一个每秒60次重新计算数十万物体位置的游戏吗?如果没有,那也没关系。如果确实重要,请参阅前一段,重构代码,这样就不必一直检查某个数组。

顺便说一下,一个有意义的基准应该运行一百万次。FWIW、console.time[End]对于快速而肮脏的基准测试来说常常派上用场。无论如何,根据你的说法,最坏的情况下,时差只不过是1.5倍左右。

小提示:Array === obj.constructor不会很好地与Array的子类配合使用。