ES6新特性七:数组的扩充详解


Posted in Javascript onApril 21, 2017

本文实例讲述了ES6新特性之数组的扩充。分享给大家供大家参考,具体如下:

1. Array.from()

1) Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map,他们都部署了iterator接口,字符串也是)。

let arrayLike = {
  '0': 'a',
  '1': 'b',
  '2': 'c',
  length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike);
console.log(arr1) // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike);
console.log(arr2) // ['a', 'b', 'c']
Array.from('hello')// ['h', 'e', 'l', 'l', 'o']
let namesSet = new Set(['a', 'b'])
Array.from(namesSet) // ['a', 'b']

2) 扩展运算符(...)背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法则是还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。

Array.from({ length: 3 });//扩展运算符就转换不了
// [ undefined, undefined, undefined ]

3) Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

var a = Array.from([1, 2, 3], x => x * x);
console.log(a)
// 等同于
var a1 = Array.from([1, 2, 3]).map(x => x * x);
console.log(a1)
var a2 = Array.from([1, 2, 3], (x) => x * x)
console.log(a2)// [1, 4, 9]
//只要有一个原始的数据结构,你就可以先对它的值进行处理,
// 然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
var a3 = Array.from({ length: 2 }, () => 'jack')
console.log(a3)// ['jack', 'jack']

2. Array.of()

返回参数值组成的数组。如果没有参数,就返回一个空数组,弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。

console.log(Array()) // []
console.log(Array(3)) // [, , ,]
console.log(Array(3, 11, 8)) // [3, 11, 8]
console.log(Array.of(3, 11, 8))// [3,11,8]
console.log(Array.of(3)) // [3]
console.log(Array.of()) // []

3. 数组实例的find() 和 findIndex()

① 数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined

var a = [1, 4, -5, 10].find((n) => n < 0)
console.log(a)
//find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。
[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10

② 数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。

[1, 5, 10, 15].findIndex(function(value, index, arr) {
 return value > 9;
}) // 2

4. 数组实例的fill()

fill方法使用给定值,填充一个数组。数组中已有的元素,会被全部抹去。

['a', 'b', 'c'].fill(7) // [7, 7, 7]
new Array(3).fill(7) // [7, 7, 7]

fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置(包左不包右)

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

5. 数组实例的 entries() 、keys() 和values()

ES6提供三个新的方法——entries()keys()values()——用于遍历数组。它们都返回一个遍历器对象. for...of 会自动的调用遍历器的next() .

for (let index of ['a', 'b'].keys()) {
 console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
 console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
 console.log(index, elem);
}
// 0 "a"
// 1 "b"

如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。

let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']

6. 数组实例的includes()

Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值。该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置。

[1, 2, 3].includes(2);   // true
[1, 2, 3].includes(4);   // false
[1, 2, NaN].includes(NaN); // true

另外,Map和Set数据结构有一个has方法,需要注意与includes区分。

Map结构的has方法,是用来查找键名的:

比如Map.prototype.has(key)WeakMap.prototype.has(key)Reflect.has(target, propertyKey)

Set结构的has方法,是用来查找值的:

比如Set.prototype.has(value)WeakSet.prototype.has(value)

7. 数组的空位

数组的空位指,数组的某一个位置没有任何值。空位不是undefined,一个位置的值等于undefined,依然是有值的。

Array(3) // [, , ,]

ES6则是明确将空位转为undefined。

console.log(Array.from(['a',,'b']))//[ 'a', undefined, 'b' ]
console.log([...['a',,'b']])// [ "a", undefined, "b" ]
let arr = [, 'a',,];
for (let i of arr) {
  console.log(i);
}//undefined a undefined
// entries()
[...[,'a'].entries()] // [[0,undefined], [1,"a"]]
// keys()
[...[,'a'].keys()] // [0,1]
// values()
[...[,'a'].values()] // [undefined,"a"]
// find()
[,'a'].find(x => true) // undefined
// findIndex()
[,'a'].findIndex(x => true) // 0

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
基于JQuery的多标签实现代码
Sep 19 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
AngularJS自动表单验证
Feb 01 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
Node.js实现文件上传
Jul 05 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
JS简单判断函数是否存在的方法
Feb 13 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
JS+CSS实现网页加载中的动画效果
Oct 27 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 Javascript
React中ES5与ES6写法的区别总结
Apr 21 #Javascript
ES6新特性六:promise对象实例详解
Apr 21 #Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 #Javascript
webpack配置的最佳实践分享
Apr 21 #Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 #Javascript
ES6新特性四:变量的解构赋值实例
Apr 21 #Javascript
jQuery+pjax简单示例汇总
Apr 21 #jQuery
You might like
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
layui导航栏实现代码
2017/05/19 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
用Eclipse写python程序
2018/02/10 Python
使用python 3实现发送邮件功能
2018/06/15 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python运行DLL文件的方法
2020/01/17 Python
基于python 取余问题(%)详解
2020/06/03 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
python实现银行账户系统
2021/02/22 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
社会保险接收函
2014/01/12 职场文书
团委竞选演讲稿
2014/04/24 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
求职简历自荐信
2014/06/18 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
社会实践活动总结
2015/02/05 职场文书
公司年夜饭通知
2015/04/25 职场文书
公司文体活动总结
2015/05/07 职场文书
老人院义工活动感想
2015/08/07 职场文书