Array中的方法
四個方面去學習數組的方法
- 方法的作用
- 是否傳遞參數
- 有沒有返回值
- 原數組是否發生改變
注意: 類數組:類似于數組,但不是數組。有length屬性
1、通過getElementsByTagName獲取的元素集合是類數組
2、函數中的實參集合arguments也是類數組
數組中的方法分類
一、增加、刪除、修改
ary.push()
- 作用:向數組末尾增加一項
- 參數:增加誰就傳遞誰
- 返回值:返回新增數組的長度
- 原有數組發生改變
其他類似方法:
ary[ary.length]=value; ary.splice(ary.length-1,0,value)
ary.pop()
- 作用:刪除數組的第最后一項
- 參數:沒有參數
- 返回值:返回被刪除的那一項,這一項數據類型就是啥
- 原有數組發生改變
其他類似方法:
ary.length--; ary.splice(ary.lenght-1,1)
ary.shift()
- 刪除數組的第一項
- 沒有參數
- 返回被刪除的那一項
- 原有數組發生改變
ary.unshift()
- 向數組開頭增加一項
- 增加誰就傳遞誰
- 返回新增數組的長度
- 原有數組發生改變
其他類似方法:ary.splice(0,0,x)
ary.splice()
可以實現增刪改
刪除功能 ary.splice(n,m)
- 從索引n開始刪除m個 (包括索引n那一項)
- 參數:n索引,m個數
- 返回值:被刪除的內容以一個新數組返回
- 原有數組發生改變
- 只傳n值:從n開始刪除到末尾
- n=0:將原有數組刪除,克隆一個一模一樣的數組返回
- 刪除一項:ary.splice(n,1),刪除索引為n的這一項
- 刪除從索引n到索引為m之間的值,splice(n,(m-n)+1)
替換功能 ary.splice(n,m,x)
- 從索引n開始刪除m個,用x替換刪除的內容
- 參數:n,m,x(x值可以有多個,從索引n前一項依次增加)
- 返回值:被刪除的內容以一個新數組返回
- 原有數組發生改變
增加功能 ary.splice(n,0,x)
- 在索引n前面增加一項
- 參數:n,0,x(x值也可以有多項)
- 返回值:返回一個空數組
- 原有數組發生改變
數組的截取和拼接
截取 ary.slice(n.m)
- 從索引n開始找到索引m處(不包含m)
- 參數:n,m
- 返回值:將找到的內容以新數組返回
- 原有數組不變
- 如果只有一個參數ary.slice(n)---從索引n開始找到末尾
- slice(0)/slice()----克隆一份,原數組不變
- 獲取數組中第n項到第m項的數組,原有數組不變----slice(n-1,m)
- 從索引n開始,截取m個。slice(n,n+m)
- Array.prototype.slice.call(arg) 可以將一個類數組轉換成數組 但不可以是元素集合
- slice截取是淺拷貝:意思就是,數組中如果有引用數據類型,這時截取出來的是一個空間地址,而不是具體的值。如果在之后,對這個引用數據進行改變。則對應的截取出來的值也會變化
拼接 ary.concat()
- 數組拼接
- 參數:要拼接的數組名或一個具體的數組
- 返回值:n個數組拼接后的新數組,誰寫在前面誰就在前面
- 原數組不變
- 當不傳遞參數的時候,克隆一份
利用push可以實現數組的合并
var array = ["football", "basketball"];
var array2 = ["volleyball", "golfball"];
var i = Array.prototype.push.apply(array,array2);
console.log(array); // ["football", "basketball", "volleyball", "golfball"]
console.log(i); // 4
將數組轉變為字符串
ary.toString()
- 將數組的每一項以逗號相隔,成為一個字符串
- 參數:沒有
- 返回值:一個字符串
- 原有數組沒有改變
當數組直接和字符串作連接操作時,將會自動調用其toString()方法。
var str = ['aa', 'bb', 'cc', 'dd'] + ',ee';
console.log(str); // "aa,bb,cc,dd,ee"
ary.join()
- 給每一項內容之間添加一個分隔符,以字符串的形式返回
- 參數:分隔符('+')/('-')/('*')等等。缺省默認為逗號
- 返回值:以字符串的形式返回
- 原有數組沒有改變
排序
ary.sort()
- 只能排序0~9之間的數,否則它會以數字的第一個字為基礎進行排序
- 參數:沒有
- 返回值:排序好的數組
- 原數組發生改變
- 數組從小到大排序 ary.sort(function(a,b){ return a-b})
- 數組從大到小排序 ary.sort(function(a,b){ return b-a})
- 如果數組的內容不是數字,而是字母或者是漢字
ary.sort(function(a,b){return a.localCompare(b)})
ary.revers()
- 把數組倒過來排序,原來的數組改變
不兼容的方法
indexOf()
- 在數組中第一次出現的索引
- 參數:數組中的值
- 返回:參數對應的索引
- 原有數組不發生改變
lastIndexOf()
- 在數組中最后一次次出現的索引
- 參數:數組中的值
- 返回:參數對應的索引
- 原有數組不發生改變
ES6新增的構造函數方法
構造器相關API
Array.of
Array.of用于將參數一次轉化為數組中的一項,然后返回這個新數組,而不管這個參數是數字還是其他。它基本上與Array構造器功能一致,唯一的區別就在單個參數的處理。
與Array的不同
Array.of(8); // [8]
Array(8); // [undefined x 8]。在Array的單個參數為數字時,創建一個數組長度為傳進來的數值的數組,每一項都為undefined.
Array.from
語法:Array.from(arrayLike[, processingFn[, thisArg]])
可以從一個類似數組的可迭代對象創建一個新的數組實例,返回一個新的數組,并不改變原數組。
其擁有三個參數,第一個為類似數組的對象,必選。第二個為加工函數,新生的數組會經過該函數的加工再返回。第三個為this作用域,表示加工函數執行時this的值。
當適用加工函數時,默認會有兩個形參,值和索引。并且必須明確指定返回值,否則將隱式的返回undefined
擁有迭代器的對象還包括:String、Set、Map、arguments。
Array.isArray()
判斷一個變量是否是一個數組。判斷是否是一個數組的方法:
var a = [];
// 1.基于instanceof
a instanceof Array;
// 2.基于constructor
a.constructor === Array;
// 3.基于Object.prototype.isPrototypeOf
Array.prototype.isPrototypeOf(a);
// 4.基于getPrototypeOf
Object.getPrototypeOf(a) === Array.prototype;
// 5.基于Object.prototype.toString
Object.prototype.toString.apply(a) === '[object Array]';
除了第五種,其他都不可靠。
prototype原型上的方法
改變自身的方法
copyWithin方法
用于數組內元素之間的替換,即替換的元素和被替換元素均是數組內的元素。
語法:arr.copyWithin(target, start[, end = this.length])
taget指定被替換元素的索引,start指定替換元素起始的索引,end可選,指的是替換元素結束位置的索引。
如果start為負,則其指定的索引位置等同于length+start,length為數組的長度。end也是如此
注意: 目前只有FireFox(32以上)實現了該方法。
var array = [1,2,3,4,5];
var array2 = array.copyWithin(0,3);
console.log(array===array2,array2); // true [4, 5, 3, 4, 5]
var array = [1,2,3,4,5];
console.log(array.copyWithin(0,3,4)); // [4, 2, 3, 4, 5]
var array = [1,2,3,4,5];
console.log(array.copyWithin(0,-2,-1)); // [4, 2, 3, 4, 5]
fill方法
與copyWidthin類似,不同之處就是,它主要用于將數組指定區間內的元素替換為某個值。
不改變自身的方法
includes(ES7)
它用來判斷當前數組是否包含某個特定的值,如果是則返回true,否則返回false.
語法:arr.includes(element, fromIndex=0)
element為需要查找的元素
fromIndex表示從該索引位置開始查找element,缺省為0,它是正向查找,即從索引處往數組末尾查找。
與indexOf方法的區別就是includes可以發現NaN.
var array = [NaN];
console.log(array.includes(NaN)); // true
console.log(arra.indexOf(NaN)>-1); // false