ES5与ES6中的Array对象

根据个人在实际开发过程中,对于Array对象的方法使用比较多的,以及出现过的问题在这里做个简单介绍。(属于个人笔记,许多方法已经熟练的就只是列出来没有详细介绍)
一、ES5

  1. 不会改变原数组的方法。

1.1 contact
参数:arrayX
说明:返回一个新的数组。

1.2 join
参数:separator(分隔符)
说明:返回一个字符串。

1.3 slice
参数:startend(可选)
说明:返回一个新的数组。参数可以为负数。开发过程中经常用slice()复制数组。

let A = [1,2,3];
let B = A.slice(1)
  1. 会改变原数组的方法。

2.1 pop
参数:none
说明:删除数组最后一个元素,数组长度减一,并返回被删除的元素,如果原数组为空,返回undefined。

2.2 push
参数:newElemmentX
说明:按照参数的先后顺序添加到数组末尾,返回新数组的长度。

2.3 reverse
参数:none
说明:颠倒数组的元素。无返回值。

2.4 shift
参数:none
说明:删除原数组第一个元素,并返回被删除的元素。

2.5 sort
参数:sortby(可选)
说明:调用sort()前,数字每个元素会调用toString()方法。如果没有参数,将按照字符编码的顺序进行排序。

var a=[1,2,3,'j','A',10,5,3];
a.sort() // [1, 10, 2, 3, 3, 5, "A", "j"]

如果有参数,参数必须是一个比较函数。

var a=[1,2,3,'j','A',10,5,3];
//降序函数
var desc = function(x,y)    
{    
    if (x > y)      
        return -1;  //返回一个小于0 的数即可
    else        
        return 1;  //返回一个大于0 的数即可
}    
//升序函数
var asc = function(x,y)    
{    
    if (x > y)      
        return 1;  //返回一个大于0 的数即可
    else            
        return -1;  //返回一个小于0 的数即可
}  
a.sort(desc);//[10, 5, 3, "j", "A", 3, 2, 1]
a.sort(asc);//[3, 5, 10, "A", "j", 1, 2, 3]

2.6 splice
参数:indexhowmanynewElemmentX(可选)
说明:返回被删除的元素组成的数组,如果没有进行删除操作,返回一个空数组。

2.7 unshift
参数:newElemmentX
说明:返回添加完后数组的长度。

二、 ES6
注:这部分是我参考阮一峰老师的[ECMAScript 6 入门]文章,自己记录的笔记,详细的内容请移步阮一峰老师的文章。

  1. 扩展运算符(...)。将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3

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

[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

该运算符主要用于函数调用。

function push(array, ...items) {
  array.push(...items);
}

function add(x, y) {
  return x + y;
}

var numbers = [4, 38];
add(...numbers) // 42

替代apply()方法

//es5
function arr(x,y,z){
    return x+y+z
}
var array=[1,2,3];
arr.apply(null,array);
//es6
arr(...array)

替代push()方法

var arr1=[1,2,3];
var arr2=[4,5,6];
arr1.push(...arr2)
  • 扩展运算符的应用

(1) 合并数组

var arr1=[1,2];
var arr2=[3,4];
var arr3=[5,6];
//es5
arr1.concat(arr2,arr3)
//es6
[...arr1,...arr2,...arr3]

(2) 与解构赋值结合

const [a,...b]=[1,2,3,4,5];
//a=1 b=[2,3,4,5]

const [a,...b]=[]
//a=undefined b=[]

const [a,...b]=[1]
//a=1 b=[]

(3) 字符串

[...'v1ta']
// ['v',1,'t','a']

(4) 实现了 Iterator 接口的对象
(5) Map 和 Set 结构,Generator 函数

  1. Array.form()

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)
下面是一个类似数组的对象,Array.from将它转为真正的数组。

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
//or Array.prototype.slice.call(arrayLike)
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

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

// NodeList对象
let ps = document.querySelectorAll('p');
Array.from(ps).forEach(function (p) {
  console.log(p);
});

// arguments对象
function foo() {
  var args = Array.from(arguments);
  // ...
}

上面代码中,querySelectorAll()方法返回的是一个类似数组的对象,可以将这个对象转为真正的数组,再使用forEach方法。

只要是部署了Iterator接口的数据结构,Array.from都能将其转为数组。

Array.from('hello')
// ['h', 'e', 'l', 'l', 'o']

let namesSet = new Set(['a', 'b'])
Array.from(namesSet) // ['a', 'b']

上面代码中,字符串和Set结构都具有Iterator接口,因此可以被Array.from转为真正的数组。

值得提醒的是,扩展运算符(...)也可以将某些数据结构转为数组。

// arguments对象
function foo() {
  var args = [...arguments];
}

// NodeList对象
[...document.querySelectorAll('div')]

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

Array.from({ length: 3 });
// [ undefined, undefined, undefined ]

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

Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);

Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]

下面的例子是取出一组DOM节点的文本内容。

let spans = document.querySelectorAll('span.name');

// map()
let names1 = Array.prototype.map.call(spans, s => s.textContent);

// Array.from()
let names2 = Array.from(spans, s => s.textContent)

Array.from()可以将各种值转为真正的数组,并且还提供map功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。

Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']

上面代码中,Array.from的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得非常灵活。

  1. Array.of()

Array.of方法用于将一组值,转换为数组。

Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
  1. copyWithin()

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

它接受三个参数。

target(必需):从该位置开始替换数据。
start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
这三个参数都应该是数值,如果不是,会自动转为数值。

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

上面代码表示将从3号位直到数组结束的成员(4和5),复制到从0号位开始的位置,结果覆盖了原来的1和2。

  1. find() 和 findIndex()

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

[1, 4, -5, 10].find((n) => n < 0)
// -5

上面代码找出数组中第一个小于0的成员。

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

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

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

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

  1. fill()

fill()方法使用给定值,填充一个数组。

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

new Array(3).fill(7)
// [7, 7, 7]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容