Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

普及一下JS1.6中数组的几个新方法

  也许你以前没有刻意去研究过这东西,但是如果用过JQ,对这个就不会陌生。因为JQ中封装了很多JS1.6的功能,并且把它们兼容到了低版本浏览器上。但是总是依赖JQ也很不好,其实JQ的效率是非常低的。如果可以用JS本身的功能去实现就没必要动用JQ。
  你可以看看MDN上对数组方法的介绍,或者去看ECMA-262的15.4.4这个部分,这个文档在“资料下载”中可以找到。但是,我觉得要想了解这玩意儿直接看看V8里的array.js的实现可以理解的更深入。
  首先是forEach方法,这玩意儿其实就是遍历数组的每一个元素。别看它的名字是forEach,其实它不是用for in循环来处理的,而是规规矩矩的遍历数组元素。只不过这个函数遍历数组时候会忽略掉不存在(或者说没有初始化)的数组项。每次都需要从哈希表中检查数组项是否存在,时间复杂度就大大增加。所以效率不如直接在代码中使用循环遍历数组来的快。这个函数其实只有一个参数,别看V8的代码里有两个参数,第二个参数只是内部使用的而已。这个回调函数接收3个参数,分别是:数组元素、元素下标、数组本身。这个貌似在MDN中找不到,不过可以在V8的实现代码中看到,也可以自己尝试出来。
  every这个方法和forEach差不多,不同之处就是它的回调函数有返回值。如果回调函数的返回值不为true就会终止遍历。所以这个方法在数组中搜索什么东西的时候比较方便。不过我觉得,需要高效的话还是自己写个循环来遍历比较好。
  some方法和every基本一样,只是回调函数的返回值判断是false的时候终止遍历。
  以上三个方法我觉得都很鸡肋,要是效率高还说的过去,这样的效率一辈子还真用不上几次这些方法。下面的filter和map方法就有点用了。
  在JQ实例中也有filter和map方法,因为这两个东西比较实用。它们也是遍历数组(遍历的方法和上面的一样,效率实在不敢恭维),并且它们的返回值也是一个数组。区别在于回调函数返回值的作用。filter方法的回调函数返回值是一个布尔值,如果为true,则在返回的数组中包含当前遍历到的数组项目。而map方法的互调函数返回值是直接被接收并放入返回的数组中的。所以map返回数组的长度和调用map的数组长度是相同的。而filter由于回调函数返回false就不会在最终的返回的数组中包含相应数组项,所以filter最终返回的数组长度是小于或等于调用filter的数组的。
  虽然这些方法的效率不怎么高(至少在V8上是很低的),不过并不是只能操作数组,也可以操作一些拟数组对象。比如DOMList和Arguments,所以在某些效率要求不高的代码中,它们还是非常方便的。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^