在性能方面,Object.constructor()与Join的存在
Object.constructor() vs Presence of Join in terms of performance
我一直在阅读这个线程,以检查参数是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
的子类配合使用。
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 用于检查数组中是否存在元素的javascript自定义方法
- str.split(someString).join(someOtherString)是否等效于替换
- Javascript 新的 Array 和 join() 方法
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 正在将事件处理程序添加到不存在的类
- 是否存在React Native“;WEB代码安全防护”;
- 一个密码测试程序,如果存在空格,它会提醒用户
- 验证会话中是否存在对象's数组
- javascript如果图像不存在don't加载它
- 如何查找值是否存在于二叉树中
- IE9的HTML5 Canvas getImageData()函数存在问题
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- CORS-服务器端cookie没有保存在chrome浏览器上
- 检查是否存在使用chrome扩展的javascript库
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- 在性能方面,Object.constructor()与Join的存在