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 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
javaScript 数值型和字符串型之间的转换
Jul 25 Javascript
jQuery Validation实例代码 让验证变得如此容易
Oct 18 Javascript
js判断某个字符出现的次数的简单实例
Jun 03 Javascript
Angular 常用指令实例总结整理
Dec 13 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
JavaScript 实现页面滚动动画
Apr 24 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
加强版phplib的DB类
2008/03/31 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
Node.js实现文件上传
2016/07/05 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
JS实现li标签的删除
2019/04/12 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
python django事务transaction源码分析详解
2017/03/17 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python一些性能分析的技巧
2020/08/30 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
德国团购网站:Groupon德国
2018/03/13 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
就业推荐表自我鉴定
2014/03/21 职场文书
企业宣传标语
2014/06/09 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
报案材料怎么写
2015/05/25 职场文书
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
Win11更新失败并提示0xc1900101
2022/04/19 数码科技