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 相关文章推荐
基于jquery可配置循环左右滚动例子
Sep 09 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
Sep 01 Javascript
微信小程序  生命周期详解
Oct 27 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
Feb 23 Javascript
ES6/JavaScript使用技巧分享
Dec 14 Javascript
vue src动态加载请求获取图片的方法
Oct 17 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 05 Javascript
js 实现ajax发送步骤过程详解
Jul 25 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
详解vue v-model
2020/08/31 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
导师推荐信范文
2014/05/09 职场文书
奥林匹克的口号
2014/06/13 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
Python内置的数据类型及使用方法
2022/04/13 Python