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

时间:2016-10-01 04:49:08

标签: javascript arrays performance

我一直在阅读这个帖子,以检查参数是否为Array或String

  

Check if object is array?

提到的解决方案是:

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

但我写了以下功能

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

我做了一些样本测试。我发现array.join()返回比object.constructor()更快的结果。我错过了什么吗?

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

的jsfiddle:

  

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

请解释。

1 个答案:

答案 0 :(得分:4)

使用obj.join的方法有时称为" duck-typing"。如果您在碰巧包含join属性的对象上使用join,那么在您提议的情况下使用Array.isArray将会失败。

只需使用为任务设计的API,例如Object.prototype.toString.call(obj) === '[object Array]'或实用程序库中的例程。他们已经通过所有的问题进行了思考。例如,Underscore使用any。从the one you mention开始,关于该主题的SO也有大量文献。

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

第二个问题是,为什么你会在几微秒内痴迷?你有一个游戏重新计算成千上万个物体的位置,每秒六十次吗?如果没有,那没关系。如果它确实重要,请参阅上一段,并重构您的代码,以便不必一直检查某个数组是什么。

顺便说一下,一个有意义的基准应该运行一百万次。 FWIW,Array === obj.constructor通常可用于快速和肮脏的基准测试。无论如何,根据你的小提琴,时差只不过是最差的1.5左右。

次要注意:Array不适合使用<?php echo $this->Html->tag( 'img', null, array( 'id' => 'image', 'src' => 'data:image/png;base64,'.$source' ) ); ?> 的子类。