ES6 新增的创建数组的方法(小结)


Posted in Javascript onAugust 01, 2019

在ES6之前,创建数组的方式有2种:

一: 通过数组字面量

let array = [1,2,3];
console.log(array);//[1,2,3]

二: 通过new Array()创建数组

let array = new Array(1, 2, 3);
console.log(array); //[1,2,3]

在大多数情况下new Array()运行良好:

let array = new Array(1, 2);
console.log(array.length); //2
console.log(array[0]); //1
console.log(array[1]); //2

array = new Array('a');
console.log(array.length); //1
console.log(array[0]);//'a'

array = new Array(1, 'a');
console.log(array.length); // 2
console.log(array[0]);//1
console.log(array[1]);//'a'

但是new Array()有一种诡异的情况:

let array = new Array(2);
console.log(array[0]); // undefined
console.log(array[1]);// undefined
console.log(array.length); // 2

当我们给new Array()传递单个数字参数时,这个数字不是作为数组元素,而是该数组的length属性而存在,而数组本身则是一个空数组。

为了解决上面这个令人类没有安全感的特性,ES6引入了Array.of()来解决这个问题:

三:Array.of()

顾名思义,of()方法就是以它接受到的参数作为元素来创造数组,上面我们说的单个数字参数的情况也同样适用:

let array = Array.of(3);
console.log(array.length); // 1
console.log(array[0]); // 3

array = Array.of(1, 2);
console.log(array.length);// 2
console.log(array[0]); // 1
console.log(array[1]);// 2

array = Array.of('a');
console.log(array.length);// 1
console.log(array[0]);// 'a'

array = Array.of(1, 'a');
console.log(array.length); // 2
console.log(array[0]);// 1
console.log(array[1]);// 'a'

四:Array.from()

ES6还增加了一个Array.from(),也是用了创建一个数组。它主要用在以类数组对象和可迭代对象为蓝本,创建对应的数组。

1: Array.from(类数组对象)

我们最熟悉的类数组对象,应该就是function的arguments对象了。接下来,我们看一个用Array.from()创建包含arguments元素的数组:

function createArrayFrom() {
  console.log(arguments instanceof Array); // false
  return Array.from(arguments);
}

let array = createArrayFrom(1, 2, 3);
console.log(array instanceof Array); // true
console.log(array.length); //3
console.log(array[0]);//1
console.log(array[1]);//2
console.log(array[2]);//3
console.log(array.indexOf(2)); //1

2: Array.from(可迭代对象)

Array.from()也可以把一个可迭代对象转换为数组:

let iteratorObject = {
  *[Symbol.iterator](){
    yield 1;
    yield 2;
    yield 3;
  }
};
let array = Array.from(iteratorObject);
console.log(array instanceof Array); // true
console.log(array.length); // 3
console.log(array[0]); // 1

五:Array.from()的第二个参数

前面的例子,我们看到了一个类数组对象和可迭代对象作为Array.from()的第一个参数,从而创建出包含它们元素的数组。Array.from()的第二个参数是一个函数,这个函数用来将类数组对象和可迭代对象的元素进行某种变换后,再作为生出数组的元素,例如:

let iteratorObject = {
  *[Symbol.iterator](){
    yield 1;
    yield 2;
    yield 3;
  }
};
let array = Array.from(iteratorObject, (item)=>{return item + 1});
console.log(array[0]); //2
console.log(array[1]); //3
console.log(array[2]); //4

这个例子里,我们提供了把每个元素值加一的变换,所以原本的1,2,3,置换到新的数组之后,元素是2,3,4。

六: Array.from()的第三个参数

Array.from()还提供第三个参数可用,第三个参数用来指定this的值,如果在整个方法的调用中有用到this 的话,看一个例子:

let firstHelper = {
  diff: 1,
  add(value){
    return value + this.diff;
  }
};
let secondHelper = {
  diff: 2
};
function createArrayFrom() {
  return Array.from(arguments, firstHelper.add, secondHelper);
}

let array = createArrayFrom(1, 2, 3);
console.log(array); //[3, 4, 5]

上面的例子里面,我们的在add()方法里面使用了this(这行代码:value + this.diff),并且add()定义在firstHelper对象,且firstHelper对象也有diff属性,但是我们的第三个参数传入的是secondHelper,所以在firstHelper.add()方法里的this值是secondHelper。

以上就是ES6新增的Array.of()和Array.from()方法,可以使得开发者用更少的代码应对更多变的创建数组的场景。

Javascript 相关文章推荐
使用jquery修改表单的提交地址基本思路
Jun 04 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
javascript实现表单提交后,提交按钮不可用的方法
Apr 18 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
Mar 30 Javascript
Web制作验证码功能实例代码
Jun 19 Javascript
Angularjs中数据绑定的实例详解
Aug 25 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
Vue利用Blob下载原生二进制数组文件
Sep 25 Javascript
一文搞懂redux在react中的初步用法
Jun 09 Javascript
JavaScript文档对象模型DOM
Nov 20 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 #Javascript
深入浅析Vue中mixin和extend的区别和使用场景
Aug 01 #Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 #Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 #Javascript
微信小程序组件传值图示过程详解
Jul 31 #Javascript
vue.js实现回到顶部动画效果
Jul 31 #Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 #Javascript
You might like
PHP 面向对象实现代码
2009/11/11 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
JS中Safari浏览器中的Date
2017/07/17 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python遍历pandas数据方法总结
2018/02/09 Python
浅谈django orm 优化
2018/08/18 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python创建临时文件和文件夹
2020/08/05 Python
新领导上任欢迎词
2014/01/13 职场文书
征婚广告词
2014/03/17 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
三好学生个人总结
2015/02/15 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript