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学习笔记二 之 变量
Dec 15 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
JavaScript Promise启示录
Aug 12 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
javascript特殊日历控件分享
Mar 07 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
Jan 19 Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 Javascript
BootStrap数据表格实例代码
Sep 13 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
Oct 14 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
p5.js临摹动态图形实现方法详解
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
php UTF8 文件的签名问题
2009/10/30 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
javascript常用的设计模式
2017/02/09 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
pandas值替换方法
2018/07/10 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
表彰大会新闻稿
2015/07/17 职场文书
PyTorch的Debug指南
2021/05/07 Python
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS