数组与伪数组

把符合以下条件的对象称为伪数组:

  • 具有length属性
  • 按索引方式存储数据
  • 不具有数组的push,pop等方法

伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push,pop等方法,但仍可以用数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用document.getElementsByTagName, document.childNodes之类的,它们返回的NodeList对象都属于伪数组。

可以使用以下方法将伪数组转化为真正的Array对象。

Array.prototype.slice

function  makeArray (c) {
try{
return Array.prototype.slice.call(c);
}catch(e){
var ret = [],i, len = c.length;
for(i = 0; i < len; i++) {
ret[i] = (c[i]);
}
return ret;
}
}

ES6中数组的新方法 Array.from()

function test(){
var arg = Array.from(arguments);
arg.push(5);
console.log(arg);
}
test(1,2,3,4); //1,2,3,4,5

ES6展开操作符

es6中,展开操作符对于实现了 Iterator 接口的对象转为真正的数组

任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组。

let nodeList = document.querySelectorAll('div');
let array = [...nodeList];

上面代码中,querySelectorAll方法返回的是一个nodeList对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于NodeList对象实现了 Iterator 。

对于那些没有部署 Iterator 接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。

let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
}; // TypeError: Cannot spread non-iterable object.
let arr = [...arrayLike];

上面代码中,arrayLike是一个类似数组的对象,但是没有部署 Iterator 接口,扩展运算符就会报错。这时,可以改为使用Array.from方法将arrayLike转为真正的数组。

concat+apply

let nodeList = document.querySelectorAll('div');
let nodeArray = Array.prototype.concat.apply([], nodeList); // apply会将nodeList展开

jquery中的,jQuery.toArray()方法

alert($('li').toArray());

jquery中,jQuery.makeArray(obj)

将类数组对象转换为数组对象。

类数组对象有 length 属性,其成员索引为 0 至 length - 1。实际中此函数在 jQuery 中将自动使用而无需特意转换。

var arr = jQuery.makeArray(document.getElementsByTagName("div"));

最新文章

  1. ORACLE序列号
  2. Java源码分析系列
  3. jQuery立体式数字滚动条增加
  4. Hadoop 权威指南学习2 (Sqoop)
  5. cocos2dx中CC_CALLBACK_1等宏中this指针实际指向
  6. 多个git账号的配置
  7. WPF绑定数据源
  8. CentOS6.5下Tomcat7 Nginx Redis配置步骤
  9. 分享自己写的一个小工具RGB转十六进制(高手勿喷)
  10. 不可或缺 Windows Native (10) - C 语言: 文件
  11. 从零开始攻略PHP(8)——面向对象(下)
  12. NSInvocation Basics
  13. 根据dwarfdump、Symbolicatecrash查找错误代码
  14. 转:浅谈命令查询职责分离(CQRS)模式
  15. 符号表(Symbol Tables)
  16. html风格的滚动条
  17. Java Web 开发环境快速搭建
  18. Newtonsoft.Json输出JSON 时动态忽略属性
  19. WCF上传下载文件
  20. OpenOCD-JTAG调试

热门文章

  1. spice在桌面虚拟化中的应用系列之三(USB映射实现,SSL加密,密码认证,多客户端支持)
  2. Guava【google】
  3. P4393 [BOI2007]Sequence 序列问题[贪心]
  4. 2019-2020-1 20199301《Linux内核原理与分析》第一周作业
  5. 第113题:路径总和II
  6. 专为简化 C 开发而设计的编程语言 Trad
  7. Codeforces Round #533 (Div. 2) E. Helping Hiasat(最大独立集)
  8. BZOJ4706 B君的多边形 (超级卡特兰数/施罗德数)
  9. perfectpixel 加载PSD图到网页中和已经写好的网页进行对比
  10. E:nth-last-child(n)