数组的扩展

1、扩展运算符

含义:扩展运算符是三个点(...),用于将一个数组转为用逗号分隔的参数序列

用法:...[‘a‘, ‘b‘, ‘c‘]

console.log(...[1, 2, 3])  // 1 2 3

console.log(1, 2, ...[3, 4, 5], 6)  // 1 2 3 4 5 6

console.log(1, 2, ...[3, 4, 5])  // 1 2 3 4 5

如果扩展运算符后面是一个空数组,则不产生作用

console.log(1, ...[])  // 1

扩展运算符的应用

(1)、替代数组的 apply 方法

a、将数组转为函数的参数

// es5 的写法
function fun (x, y ,z) {
    console.log(x+y+z)
}

var arg = [1, 2, 3]

fun.apply(null, arg)  // 6

// es6 的写法
function fun (x, y ,z) {
    console.log(x+y+z)
}

var arg = [1, 2, 3]

fun( ...arg )  // 6

b、取数组的最大值

// es5 的写法
Math.max.apply( null, [3, 33, 333])  // 333

// es6 的写法
Math.max( ...[3, 33, 333])  // 333

c、将一个数组添加到另一个数组的尾部

// es5 的写法
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
Array.prototype.push.apply( arr1, arr2)
console.log(arr1)  // [1, 2, 3, 4, 5, 6]

// es6 的写法
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
arr1.push( ...arr2)
console.log(arr1)  // [1, 2, 3, 4, 5, 6]

d、官网提供的另一个案例

// ES5
new (Date.bind.apply(Date, [null, 2015, 1, 1]))  // Sun Feb 01 2015 00:00:00 GMT+0800 (中国标准时间)

// ES6
new Date(...[2015, 1, 1])  // Sun Feb 01 2015 00:00:00 GMT+0800 (中国标准时间)

(2)、合并数组

es5 使用 contact( ) 连接两个或多个数组,并返回被连接数组的副本

// es5
var arr1 = [1, 2]
var arr2 = [3, 4]
var arr = arr1.concat( arr2)
console.log( arr )  // [1, 2, 3, 4]

es6 可使用扩展运算符拼接 [...arr1, ...arr2, ...arr3]

// es6
var arr1 = [1, 2]
var arr2 = [3, 4]
var arr = [...arr1, ...arr2]
console.log(arr)  // [1, 2, 3, 4]

(3)、字符串转数组

扩展运算符还可以将字符串转成真正的数组

[...‘hello‘]  // ["h", "e", "l", "l", "o"]

(4)、函数的返回值

js 的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符可提供变通方法

var dateFields = readDateFields(database)

var d = new Date(...dateFields)

上面代码从数据库取出一行数据,通过扩展运算符,直接将其传入构造函数Date

2、Array.from ()

Array.from () 方法用于将 类数组对象 和  可遍历的对象 转成真正的数组

var arrayLike = {
    ‘0‘: ‘es6‘,
    ‘1‘: ‘node.js‘,
    ‘2‘: ‘vue‘,
    length: 3
}

// es5
var arr1 = [].slice.call(arrayLike);
console.log( arr1 )  // ["es6", "node.js", "vue"]

// es6
var arr2 = Array.from ( arrayLike)
console.log( arr2)  // ["es6", "node.js", "vue"]

实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象。Array.from都可以将它们转为真正的数组

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <p>西游记</p>
    <p>三国演义</p>
    <p>水浒传</p>
    <p>红楼梦</p>

<script>
    var p = document.querySelectorAll(‘p‘)
    var pArray = Array.from(p)
    pArray.forEach(function (item) {
        console.log(item.textContent)
    })
    //西游记
    //三国演义
    //水浒传
    //红楼梦
</script>
</body>
</html>

Array.from () 还可以接受第二个参数,用来对每个元素进行处理,将处理后的值放入返回的数组

Array.from([1,3,5],function(item){return item*2})  // [2, 6, 10]

3、Array.of ()

Array.of () 方法 用于将一组值,转成数组

Array.of(3,4,5)  // [3, 4, 5]
Array.of(3)  // [3]
Array.of(3).length  // 1

Array.of() 总是返回参数值组成的数组。如果没有参数,就返回一个空数组

Array.of()  // []

4、数组实例的 copyWithin()

copyWithin() 方法 在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。

Array.prototype.copyWithin(target, start = 0, end = this.length)

它接受三个参数

target(必需):从该位置开始替换数据。
start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
end(可选):到该位置 前 停止读取数据,默认等于数组长度。如果为负值,表示倒数。(不包含end位置的数据)

这三个参数都应该是数值,如果不是,会自动转为数值

[1, 2, 3, 4, 5].copyWithin(0, 3)  // [4, 5, 3, 4,5]

// 上例表示
// 1、从下标为3的位置(数字4)开始读取数据,一直到数组最后一位
// 2、把读到的数据 4和5,从下标为0的位置(数字1)开始替换
// 将3号位复制到0号位,不包含下标为4的数据
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]

// -2相当于3号位,-1相当于4号位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]

// 将3号位复制到0号位
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}

// 将2号位到数组结束,复制到0号位
var i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);
// Int32Array [3, 4, 5, 4, 5]

5、数组实例的 find() 和 findIndex()

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

[1,2,3,4,5,6].find(function(item){return item>3})  // 4

find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组

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

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

[1,2,3,4,5,6].findIndex(function(item){return item>3})  // 4

另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足

[NaN].indexOf(NaN)  // -1

[NaN].findIndex(y => Object.is(NaN, y))  // 0

上面代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到

6、数组实例的 includes()

Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES2016 引入了该方法

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

该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始

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

7、数组实例的 entries(),keys() 和 values()

keys()是对键名的遍历

values()是对键值的遍历

entries()是对键值对的遍历

for(let index of [‘1‘,‘c‘,‘ks‘].keys()){
    console.log(‘keys‘,index);
}
// keys 0
// keys 1
// keys 2

for(let value of [‘1‘,‘c‘,‘ks‘].values()){
    console.log(‘values‘,value);
}
// values ‘1‘
// values ‘c‘
// values ‘ks‘

for(let [index,value] of [‘1‘,‘c‘,‘ks‘].entries()){
    console.log(‘entries‘,index,value);
}
// entries 0 1
// entries 1 c
// entries 2 ks
时间: 2024-10-16 22:17:40

数组的扩展的相关文章

ES6对数组的扩展

ECMAScript6对数组进行了扩展,为数组Array构造函数添加了from().of()等静态方法,也为数组实例添加了find().findIndex()等方法.下面一起来看一下这些方法的用法. Array.from() Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回.例如将dom节点集合转化为数组,以前我们可能都会这样写: var divs = document.querySelectAll("div"); [].slice.call(

数组功能扩展--差集,并集,合集,去重

//数组功能扩展 Array.prototype.each = function(fn){       fn = fn || Function.K;        var a = [];        var args = Array.prototype.slice.call(arguments, 1);        for(var i = 0; i < this.length; i++){            var res = fn.apply(this,[this[i],i].conc

ES6--字符串、正则、数值、数组的扩展

三.字符串的扩展 字符编码 JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节.对于那些需要4个字节储存的字符(Unicode码点大于0xFFFF的字符),JavaScript会认为它们是两个字符.然而汉字往往就是4个字节存储,ES6之前处理起来有些麻烦. 示例:字符编码 var ChineseName = "李刚"; var EnglishName = "ligang"; ChineseName.codePointAt(1); // 0

从js的repeat方法谈js字符串与数组的扩展方法

js将字符串重复N次的repeat方法的8个版本 /* *@desc: 将一个字符串重复自身N次 */ //版本1:利用空数组的join方法 function repeat(target, n) { return (new Array(n + 1)).join(target); } //版本2:之所以要创建一个带length属性的对象 是因为要调用数据的原型方法,需要指定call的第一个参数为类数组对象 //类数组对象的必要条件是其length属性的值为非负数 function repeat(t

ES6标准学习: 4、数组的扩展

数组的扩展 一.类数组对象与可遍历对象转换为数组 Array.from()方法用于将类数组对象.可遍历对象转换为数组,其中可遍历对象包括es6新增的set和map结构 所谓的类数组对象,本质特征是必须拥有length属性 1 let arrayLikeObj = { 2 '0': 'a', 3 '1': 'b', 4 '2': 'c', 5 length: 3 6 } 7 8 ES5转换为数组: 9 let arr = [].slice.call(arrayLikeObj) // ['a', '

数组的复制及ES6数组的扩展

一.数组的复制 // alert([1,2,3]==[1,2,3]); let cc = [0,1,2]; let dd = cc; alert(dd==cc);//此时改变dd会影响cc ES5 只能用变通方法来复制数组. const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2] //使用ES6语法会防止这种现象出现 const a1 = [1, 2]; // 写法一 const a2 = [...a1]; // 写法

ES 6 : 数组的扩展

1.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)对象. 下面是一个类似数组的对象,Array.from将它转为真正的数组. 只要是部署了Iterator接口的数据结构,Array.from都能将其转为数组. 以上代码中,字符串和Set结构都具有Iterator接口,因此可以被Array.from转为真正的数组. 对于还没有部署该方法的浏览器,可以用Array.prototype.slice方法替代: const toA

js数组方法扩展

/** * Created by Administrator on 2016/9/1. */ //数组去重 Array.prototype.unique = function(){ this.sort(); var re=[this[0]]; for(var i = 1; i < this.length; i++){ if( this[i] !== re[re.length-1]){ re.push(this[i]); } } return re; } //扩展数组方法:查找指定元素的下标 Ar

ES6-05:数组的扩展

ES6对于JavaScript数组对象的扩展,主要是为了增强数组的创建及元素的操作方法:具体来说即一个运算符.数组创建方法.数组元素操作方法.数组属性操作方法四个方面: 1.增加一个运算符--扩展运算符... 扩展运算符(spread):如同rest参数的逆运算,将一个数组转换成用逗号分隔的序列,扩展运算符内部调用的是数据结构的Interator接口,因此,主要有Iterator接口的对象,,都可以使用扩展运算符:可替代apply方法: console.log(...[1,2,3]);//1 2