数组集结号

1,610 阅读7分钟

第一次在掘金写文章,准备把数组相关的方法和内容总结一下。

Array类型:数组的每一项可以保存任何类型的数据。

数组包含的属性和方法如下:

接下来我会一一总结。

1、创建数组的基本方式有三种:

1.1、使用Array构造函数

let arr1 = new Array()    // 创建一个空数组 []
let arr2 = new Array(3)  // 创建一个长度为3的空数组 
let arr3 = new Array('blue','green','yellow') // 创建一个['blue','green','yellow']的数组

在使用Array构造函数时,也可以不用new

let arr1 = Array()    // 创建一个空数组 []
let arr2 = Array(3)  // 创建一个长度为3的空数组 
let arr3 = Array('blue','green','yellow') // 创建一个['blue','green','yellow']的数组

1.2、使用数组字面量表示法

let arr4 = []    // 创建一个空数组 []
let arr5 = [,,,]  // 创建一个长度为3或者4的空数组  注:在IE8及IE8以下长度为4,其他浏览器为长度为3
let arr6 = ['blue','green','yellow'] // 创建一个['blue','green','yellow']的数组

1.3、使用Array.of()

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

Array.of(3, 11, 8) // [3,11,8]
Array.of() // 生成一个空数组 []
Array.of(3) // [3]      对比 Array(3) 创建一个长度为3的空数组
Array.of(3).length // 1

这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。

2、检测数组:

2.1、使用instanceof操作符

[1,2,3] instanceof Array // true

instanceof适用于只有一个全局执行环境,如果网页中包含多个框架,那就存在多个执行环境,从而存在不同版本的Array的构造函数。为了解决这个问题,ES5新增了Array.isArray()。

2.2、使用Array.isArray()

这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个环境创建的。

Array.isArray([1,2,3])// true

2.3、使用Object.prototype.toString

这个方法能够准确地判断一个值的数据类型,vue中的源码中就是用这种方法来判断数据类型的,也是我推荐并经常使用的。

let dataType = Object.prototype.toString.call([1,2,3])// [object Array]
dataType.slice(8,-1) //  Array

// 下面是vue源码中做数据判断的写法
  /**
   * Get the raw type string of a value, e.g., [object Object].  获取值的原始类型字符串,例如[object object]。
   */
var _toString = Object.prototype.toString;

function toRawType (value) {
  return _toString.call(value).slice(8, -1)
}

3、转换方法:

3.1、使用toString()

使用这个方法使数组转化为以逗号分割的字符串

[1,2,3].toString() // "1,2,3"

3.2、使用valueOf()

使用这个方法返回的还是数组本身

let array1 = [1,2,3]
array1 === array1.valueOf() // true

3.3、使用join()

使用这个方法把数组转化为字符串,是我们经常用到的一种方法,join(string)只接收一个参数,即用作分隔符的字符串,如果不传值或者传入的是undefined,则使用逗号作为分隔符。

[1,2,3].join() // "1,2,3"
[1,2,3].join(undefined) // "1,2,3"
[1,2,3].join("||") // "1||2||3"

如果数组中有一项的值是null或者是undefined,那么该值就在join()、toLocaleString()、toString()方法返回的结果中以空字符串表示,valueOf()还是返回自身。

[null,undefined,3].join() // ",,3"
[null,undefined,3].toString() // ",,3"
[null,undefined,3].valueOf()  // [null, undefined, 3]

4、栈方法:

栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(也叫推入)和移除(叫做弹出),只发生在一个位置----栈的顶部。数组中的push()和pop(),实现了类似栈的行为。

4.1、push()

push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回数组的长度并且会改变数组本身

let num = new Array();
let numLength = num.push(1,2,3,4,5,6,7,8,9) // 返回的是添加之后数组的长度,并且会改变数组本神
numLength // 9
num // [1, 2, 3, 4, 5, 6, 7, 8, 9]
let animals = ['dog']
animals.push('cat','bird')
animals  // ["dog", "cat", "bird"]

4.2、pop()

pop()方法没有参数,用于从数组末尾移除最后一项,减少数组的length值,然后返回移除的项并且会改变数组本身

let num = [1, 2, 3, 4, 5, 6];
let numItem = num.pop();
numItem // 6
num // [1, 2, 3, 4, 5]

let animals = ["dog", "cat", "bird"]
let animalsItem = animals.pop();
animalsItem // bird
animals // ["dog", "cat"]

5、队列方法:

队列数据结构的访问规则是FIFO(First-In-First-Out,先进先出),队列在列表的末端添加项,从列表的前端移除项。push()是向数组末端添加项的方法,shift()是从数组前端取得项的方法,它能够移除数组中的第一项并返回该项,同时将数组长度减1。结合使用shift()和push()方法,可以像使用队列一样使用数组。

5.1、shift()

shift()方法没有参数,用于从数组前面移除第一项,减少数组的length值,然后返回移除的项并且会改变数组本身

let num = [1, 2, 3, 4, 5, 6];
let numItem = num.shift();
numItem // 1
num // [2, 3, 4, 5, 6]

let animals = ["dog", "cat", "bird"]
let animalsItem = animals.shift();
animalsItem // dog
animals // [cat", "bird"]

5.2、unshift()

unshift()与shift()用法相反
unshift()方法可以接收任意数量的参数,把它们整体添加到数组最前面,并返回数组的长度并且会改变数组本身

let num = [1, 2, 3, 4, 5, 6];
let numItem = num.unshift(7,8,9);
numItem // 9
num // [ 7, 8, 9, 1, 2, 3, 4, 5, 6]  这里请注意是把7,8,9整个加在了1,2,3,4,5,6的前面,而不是循环遍历加的。

let animals = ["dog", "cat", "bird"]
let animalsItem = animals.unshift('monkey','tiger');
animalsItem // 4
animals // ["monkey","tiger","dog","cat","bird"]  

6、重排序方法:

数组中的重排序方法是reverse()和sort()

6.1、reverse()

reverse()方法只是把数组的顺序倒着排列一下,没有做大小的排序,并且会改变原数组

let arr7 = [1,3,4,2,6,8,0]
arr7.reverse();
arr7 // [0, 8, 6, 2, 4, 3, 1]

6.2、sort()

因为reverse()不够灵活,所以才有了sort()这种排序方式。 在默认情况下,sort()方法按照生序方法排列数组,默认排序方式是从小到大。注意:sort()会改变原数组。

let arr8 = [1,8,9,2,7,4,3,-2,-4,-1,0]
arr8.sort();
arr8 // [-1, -2, -4, 0, 1, 2, 3, 4, 7, 8, 9]

sort()方法会调用每个数组项的toString()的转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。

let arr9 = [1,15,5,10]
arr9.sort();
arr9 // [1, 10, 15, 5]

虽然数值5小于10,但进行字符串比较时,"10"则位于"5"的前面,所以数组的顺序就改变了。 因此sort()方法可以接收一个比较函数作为参数,以便于我们指定哪个值位于哪个值的前面。

function compare(value1,value2){
    if(value1<value2){
        return -1;
    }else if(value1>value2){
        return 1;
    }else{
        return 0;
    }
}
let arr10 = [1,3,20,7,19,10,12,5]
arr10.sort(compare)
arr10 // [1, 3, 5, 7, 10, 12, 19, 20]

这个比较函数可以适用于大多数数据类型,只要将其作为参数传递给sort()函数就行。 这个比较函数是升序,那么怎么能够记住呢?这里有个小技巧(把value1看作一直在前面):把比较符号(>、<、=)看作减号-,value1 < value2 => value1 - value2 = -1, 说明value1小于value2,value1在value2前面。 那么降序的方法就是相反

function compare2(value1,value2){
    if(value1<value2){
        return 1;
    }else if(value1>value2){
        return -1;
    }else{
        return 0;
    }
}
let arr11 = [1,3,20,7,19,10,12,5]
arr11.sort(compare2)
arr10 // [20, 19, 12, 10, 7, 5, 3, 1]

对于数值类型或者其valueOf()方法会返回数值类型的对象类型,可以使用一个更简单的比较函数,这个函数只要第二个值减去第一个值即可。

// 升序
function compare1(value1,value2){
    return value1-value2
}
let arr12 = [1,3,5,16,9,10,18,7,2]
arr12.sort(compare1)
arr12 // [1, 2, 3, 5, 7, 9, 10, 16, 18]

// 降序
function compare2(value1,value2){
    return value2-value1
}
let arr13 = [1,3,5,16,9,10,18,7,2]
arr13.sort(compare2)
arr13 // [18, 16, 10, 9, 7, 5, 3, 2, 1]

当然sort()方法还有许多其他的一些用法,这里就不一一介绍了。