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中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
深入浅析Bootstrap列表组组件
May 03 Javascript
浅析JSONP技术原理及实现
Jun 08 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
Jan 11 Javascript
VueJs组件之父子通讯的方式
May 06 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
jQuery选择器之基本过滤选择器用法实例分析
Feb 19 jQuery
vue实现页面内容禁止选中功能,仅输入框和文本域可选
Nov 09 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
详解基于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
JS实现php的伪分页
2008/05/25 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
复制js对象方法(详解)
2013/07/08 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
vue环境搭建简单教程
2017/11/07 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
python装饰器初探(推荐)
2016/07/21 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
金融学专科生自我鉴定
2014/02/21 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python