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]

例子参考:http://es6.ruanyifeng.com/#docs/array

ES6之数组扩展方法【一】(相当好用)的更多相关文章

  1. es6 的数组的方法

    es6 数组的拓展 数组的类 Array 数组的定义: 1. var arr=[]; 2. var arr=new Array(3) // 3 代表有三个元素 arr[0]=12; arr[1]=24 ...

  2. es6 数组扩展方法

    1.扩展运算符 含义: 扩展运算符,三个点(...),将一个数组转为用逗号分隔的参数顺序. 例如: console.log([1,2,3]); console.log(...[1,2,3]);   结 ...

  3. ES6之字符串扩展方法(常用)

    es6这个String对象倒是扩展了不少方法,但是很多都是跟字符编码相关,个人选了几个感觉比较常用的方法: includes 搜索字符的神器 还记得我们之前如何判断某个字符串对象是否包含特地字符的吗? ...

  4. ES6(五) 数组扩展

    Array.of方法用于将一组值,转换为数组.  Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES ...

  5. es6 filter() 数组过滤方法总结

    1.创建一个数组,判断数组中是否存在某个值 var newarr = [ { num: , val: 'ceshi', flag: 'aa' }, { num: , val: 'ceshi2', fl ...

  6. call,apply,bind与es6的数组扩展运算符...

    js中每一个Function对象都有一个apply个一个call方法: function.apply(thisObj,[argArray]); function.call(thisObj,arg1,a ...

  7. es6 filter() 数组过滤方法总结(转载)

    1.创建一个数组,判断数组中是否存在某个值 var newarr = [ { num: 1, val: 'ceshi', flag: 'aa' }, { num: 2, val: 'ceshi2', ...

  8. 关于ES6的数组字符串方法

    注:ES6的一些新属性会显示语法错误,不过不会影响效果,在Languages里面也可以调: let:用来定义变量 特点:只能在代码块里面使用,let拥有块级作用域;并且let不允许重复声明;比如: v ...

  9. 为js数组扩展方法

    (function(global,undefined){ //javascript冒泡排序,直接添加到基础类型Array的原型上 Function.prototype.method = functio ...

随机推荐

  1. 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' for column 'name' at row 1的异常

    这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 我的解决方案是这样的 1.在mysql ...

  2. Spring Security OAuth2 开发指南

    官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. 转载请注明来源:htt ...

  3. ola.hallengren的SQL Server维护脚本

    ola.hallengren的SQL Server维护脚本 下载地址 http://files.cnblogs.com/files/lyhabc/ola.hallengrenMaintenanceSo ...

  4. 日期格式 CST

    从es 取出来一个date 字段, 结果竟然是 2016-10-10T10:48:58.000Z 这样的字符串, 这个是什么格式啊??? CST ? 只能自己转换了! 通过"yyyy-MM- ...

  5. float---浮动带来的影响与清除浮动带来的影响方法----在路上(20)

    使用float会带来哪些影响: 脱标:无行级块级之分: 相互贴靠:若想之间有空隙可用margin与padding: 顶边对齐: 文字环绕: 当使用float后,子标签脱离父标签,父标签就会失去高度,此 ...

  6. 解析大型.NET ERP系统 多国语言实现

    实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字..NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 ...

  7. .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

    一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文 ...

  8. Java异常总结

    异常就是在程序中可能要发生的未知错误,java机制中异常分为2大类:Exception和Error. 对异常的处理方式有2种,一是将异常通过关键字throws抛出,二是将异常进行try catch处理 ...

  9. Install and Configure SharePoint 2013 Workflow

    这篇文章主要briefly introduce the Install and configure SharePoint 2013 Workflow. Microsoft 推出了新的Workflow ...

  10. 安卓v7支持包下的ListView替代品————RecyclerView

    RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术般的控件. 项目已经同步至github:https://github.com/ ...