我一直在阅读这个帖子,以检查参数是否为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帖子中的答案不正确?
的jsfiddle:
请解释。
答案 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'
)
);
?>
的子类。