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 相关文章推荐
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
Nov 09 Javascript
Js-$.extend扩展方法使方法参数更灵活
Jan 15 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
VUEJS实战之利用laypage插件实现分页(3)
Jun 13 Javascript
微信小程序 首页制作简单实例
Apr 07 Javascript
vue.js组件之间传递数据的方法
Jul 10 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
Vue.js组件通信的几种姿势
Oct 23 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
Apr 21 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
js表数据排序 sort table data
2009/02/18 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
node跨域请求方法小结
2017/08/25 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python中的id()函数指的什么
2017/10/17 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
酷瑞网络科技面试题
2012/03/30 面试题
服装设计专业自荐书范文
2013/12/30 职场文书
高一数学教学反思
2014/02/07 职场文书
工作违纪检讨书
2014/02/17 职场文书
保护环境的标语
2014/06/09 职场文书
七一党日活动总结
2014/07/08 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS