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 相关文章推荐
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
May 03 Javascript
jQuery设置与获取HTML,文本和值的简单实例
Feb 26 Javascript
Jquery动态替换div内容及动态展示的方法
Jan 23 Javascript
jQuery使用each方法与for语句遍历数组示例
Jun 16 Javascript
基于jQuery实现火焰灯效果导航菜单
Jan 04 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
Jul 20 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
微信小程序获取用户信息并保存登录状态详解
May 10 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 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中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
python如何通过protobuf实现rpc
2016/03/06 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
浅谈Django REST Framework限速
2017/12/12 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Python2与Python3的区别实例总结
2019/04/17 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
五种Python转义表示法
2020/11/27 Python
python math模块的基本使用教程
2021/01/16 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
P/Invoke是什么
2015/07/31 面试题
教学实习自我评价
2014/01/28 职场文书
机修工工作职责
2014/02/21 职场文书
2014年端午节活动方案
2014/03/11 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
务工证明怎么写
2015/06/18 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
Python Matplotlib绘制条形图的全过程
2021/10/24 Python