ES6中的数组扩展方法


Posted in Javascript onAugust 26, 2016

form 转化为真正的数组

先说一下使用场景,在Js中,我们要经常操作DOM,比如获取全部页面的input标签,并且找到类型为button的元素,然后给这个按钮注册一个点击事件,我们可能会这样操作;

var inputObjs=document.getElementsByTagName('input');
for(var i=0;i<inputObjs.length;i++){
if(inputObjs[i].type==='button'){
inputObjs[i].onclick=function(){
return;
}
}
}

这样写肯定是没有问题的,但是我们知道很多操作数组的方法比for循环好用多了,比如es5的forEach方法就很好用;但是能直接用吗?不能!因为dom对象集合不是一个真正得Array数组类型,直接使用会报错的;

var inputObjs=document.getElementsByTagName('input');
inputObjs.forEach(); //inputObjs.forEach is not a function

尽管如此我们还是可以用,不能直接用可以间接用,使用js强大的对象冒充功能即可;

var inputObjs=document.getElementsByTagName('input');
console.info(inputObjs); //[]length: 0__proto__: HTMLCollection
console.info([].slice.call(inputObjs)); //[]length: 0__proto__: Array[0]

这样转化为真正的数组之后就可以随便调用数组的方法啦;这种方法固然可行,但是不太容易理解而且太过于“曲折”,es6给我们提供了一个更为简单直接的方法,form,使用起来很简单:

var inputObjs=document.getElementsByTagName('input');
console.info(inputObjs); //[]length: 0__proto__: HTMLCollection
console.info(Array.from(inputObjs)); //[]length: 0__proto__: Array[0]

结果是一样的但是语义上更加贴切也更容易理解,是不是很好用啊!当然这些还不够,不仅仅是类数组任何数据类型都能使用此方法转化为数组,但是不同的类型效果是不一样的,测试如下:

let str='google';
console.log(Array.from(str)); //["g", "o", "o", "g", "l", "e"]
let num=234;
console.log(Array.from(num)); //[]
let bol=false;
console.log(Array.from(bol));
let obj={foo:'foo',bar:'bar'};
console.log(Array.from(obj)); //[]
let superObj={0:'foo',1:'bar',length:2};
console.log(Array.from(superObj)); //["foo", "bar"]

这里列出了不同的数据类型调用该方法后的结果,值得留意的是字符串和一些特殊对象是可以转化为有内容的数组的,特殊的对象是指内容按照数字键值对排列,并且有length属性的对象;这种对象是可以使用for循环的,而字符串也是可以使用for循环来得到每一个字符的,所以归结为一句话,能使用for循环输出内容的使用from方法就不是一个空数组;在这里提醒一下,使用过jQuery的小伙伴可以留意一下,当你使用选择器选择元素返回的jquery对象是什么结构的?其实就是我们例子中最后一个的结构,具体可以参考我的jQuery源码分析系列文章

of 将值转化为数组

创建数组有两种方法一种是构造函数式:

let arr=Array(1,2,3);

另一种是最常用的字面量创建:

let arr=[1,2,3];

Array.of方法其实是对第一个种方式的补充,用法如下:

console.log(Array.of(1,2,3)); //[1,2,3]

貌似跟跟构造方法一样的效果,那这个方法为什么还有存在的必要呢?看下面的例子就明白了:

console.log(Array()); //[]
console.log(Array(1)); //[undefined]
console.log(Array(1,2)); //[1,2]

在这个例子中参数数量的不同其代表的意义不一样,只有一个参数时,参数表示的是长度,大于1一个参数时表示的元素,会引起混淆,但是Array.of方法就不会存在此问题吗,因为其参数始终表示的元素:

console.log(Array.of()); //[]
console.log(Array.of(1)); //[1]
console.log(Array.of(1,2)); //[1,2]

copyWithin 数组内部数据复制替换

copyWithin方法主要作用是数组内部值的替换,该方法接受三个参数,分别表示开始复制位置、结束复制位置和插入位置,示例如下:

[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]// 将3号位复制到0号位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
// -2相当于3号位,-1相当于4号位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]
// 将3号位复制到0号位
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}
// 将2号位到数组结束,复制到0号位
var i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);
// Int32Array [3, 4, 5, 4, 5]
// 对于没有部署TypedArray的copyWithin方法的平台
// 需要采用下面的写法
[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
// Int32Array [4, 2, 3, 4, 5]

以上所述是小编给大家介绍的ES6中的数组扩展方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 一段左右两边随屏滚动的代码
Jun 18 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
Apr 17 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
JavaScript获取对象在页面中位置坐标的方法
Feb 03 Javascript
noty ? jQuery通知插件全面解析
May 18 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
Vue+Element实现动态生成新表单并添加验证功能
May 23 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 08 Javascript
Vue 2.0双向绑定原理的实现方法
Oct 23 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
Apr 16 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 #Javascript
XMLHttpRequest Level 2 使用指南
Aug 26 #Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
Aug 26 #Javascript
JavaScript组合模式学习要点
Aug 26 #Javascript
前端面试题及答案整理(二)
Aug 26 #Javascript
js前端面试题及答案整理(一)
Aug 26 #Javascript
JavaScript中ES6字符串扩展方法
Aug 26 #Javascript
You might like
深入php处理整数函数的详解
2013/06/09 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
简单实现PHP留言板功能
2016/12/21 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
javascript正则表达式总结
2016/02/29 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
神经网络python源码分享
2017/12/15 Python
python使用matplotlib绘制热图
2018/11/07 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
django基础学习之send_mail功能
2019/08/07 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Python远程linux执行命令实现
2020/11/11 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
学校元旦晚会方案
2014/02/19 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
自我检讨报告
2015/01/28 职场文书
导游词之湖北武当山
2019/09/23 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python