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 相关文章推荐
根据地区不同显示时间的javascript代码
Aug 13 Javascript
js 字符串操作函数
Jul 25 Javascript
Jquery Ajax的Get方式时需要注意URL地方
Apr 07 Javascript
Javascript简单实现可拖动的div
Oct 22 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
jQuery动态修改超链接地址的方法
Feb 13 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
Feb 28 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
基于jQuery实现咖啡订单管理简单应用
Feb 10 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
Jul 27 Javascript
vue 项目引入echarts 添加点击事件操作
Sep 09 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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python切片知识解析
2016/03/06 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Python while循环使用else语句代码实例
2020/02/07 Python
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
西式婚礼证婚词
2014/01/12 职场文书
《忆江南》教学反思
2014/04/07 职场文书
社会工作专业求职信
2014/07/15 职场文书
岳麓书院导游词
2015/02/03 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
《司马光》教学反思
2016/02/22 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL