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 关于# 和 void的区别分析
Oct 26 Javascript
js判断60秒以及倒计时示例代码
Jan 24 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
vue-router路由参数刷新消失的问题解决方法
Jun 17 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
Dec 05 Javascript
详解Vue demo实现商品列表的展示
May 07 Javascript
微信小程序用户拒绝授权的处理方法详解
Sep 20 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
vue 取出v-for循环中的index值实例
Nov 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系统流量分析的程序
2006/10/09 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
Python数据持久化shelve模块用法分析
2018/06/29 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
公务员职业生涯规划书范文  
2014/01/19 职场文书
高中英语教学反思
2014/02/04 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Node与Python 双向通信的实现代码
2021/07/16 Javascript