所有的數(shù)組實(shí)例都繼承于 Array.PRototype。
所有的數(shù)組方法都定義在 Array.prototype 身上, 和其他的構(gòu)造函數(shù)一樣,你可以通過擴(kuò)展 Array 的 prototype 屬性上的方法來給所有數(shù)組實(shí)例增加方法。
Array.prototype 本身也是個(gè)數(shù)組。Array.isArray(Array.prototype); // true會改變自身的方法
下面的這些方法會改變調(diào)用它們的對象自身的值:
Array.prototype.copyWithin()在數(shù)組內(nèi)部,將一段元素序列拷貝到另一段元素序列上,覆蓋原有的值。Array.prototype.fill()將數(shù)組中指定區(qū)間的所有元素的值,都替換成某個(gè)固定的值。Array.prototype.pop()刪除數(shù)組的最后一個(gè)元素,并返回這個(gè)元素。Array.prototype.push()在數(shù)組的末尾增加一個(gè)或多個(gè)元素,并返回?cái)?shù)組的新長度。Array.prototype.reverse()顛倒數(shù)組中元素的排列順序,即原先的第一個(gè)變?yōu)樽詈笠粋€(gè),原先的最后一個(gè)變?yōu)榈谝粋€(gè)。Array.prototype.shift()刪除數(shù)組的第一個(gè)元素,并返回這個(gè)元素。Array.prototype.sort()對數(shù)組元素進(jìn)行排序,并返回當(dāng)前數(shù)組。Array.prototype.splice()在任意的位置給數(shù)組添加或刪除任意個(gè)元素。Array.prototype.unshift()在數(shù)組的開頭增加一個(gè)或多個(gè)元素,并返回?cái)?shù)組的新長度。不會改變自身的方法
下面的這些方法絕對不會改變調(diào)用它們的對象的值,只會返回一個(gè)新的數(shù)組或者返回一個(gè)其它的期望值。
Array.prototype.concat()返回一個(gè)由當(dāng)前數(shù)組和其它若干個(gè)數(shù)組或者若干個(gè)非數(shù)組值組合而成的新數(shù)組。Array.prototype.includes()判斷當(dāng)前數(shù)組是否包含某指定的值,如果是返回 true,否則返回 false。Array.prototype.join()連接所有數(shù)組元素組成一個(gè)字符串。Array.prototype.slice()抽取當(dāng)前數(shù)組中的一段元素組合成一個(gè)新數(shù)組。Array.prototype.toSource()返回一個(gè)表示當(dāng)前數(shù)組字面量的字符串。遮蔽了原型鏈上的 Object.prototype.toSource() 方法。Array.prototype.toString()返回一個(gè)由所有數(shù)組元素組合而成的字符串。遮蔽了原型鏈上的 Object.prototype.toString() 方法。Array.prototype.toLocaleString()返回一個(gè)由所有數(shù)組元素組合而成的本地化后的字符串。遮蔽了原型鏈上的 Object.prototype.toLocaleString() 方法。Array.prototype.indexOf()返回?cái)?shù)組中第一個(gè)與指定值相等的元素的索引,如果找不到這樣的元素,則返回 -1。Array.prototype.lastIndexOf()返回?cái)?shù)組中最后一個(gè)(從右邊數(shù)第一個(gè))與指定值相等的元素的索引,如果找不到這樣的元素,則返回 -1。遍歷方法
在下面的眾多遍歷方法中,有很多方法都需要指定一個(gè)回調(diào)函數(shù)作為參數(shù)。在回調(diào)函數(shù)執(zhí)行之前, 數(shù)組的長度會被緩存在某個(gè)地方,所以,如果你在回調(diào)函數(shù)中為當(dāng)前數(shù)組添加了新的元素, 那么那些新添加的元素是不會被遍歷到的。此外,如果在回調(diào)函數(shù)中對當(dāng)前數(shù)組進(jìn)行了其它修改, 比如改變某個(gè)元素的值或者刪掉某個(gè)元素,那么隨后的遍歷操作可能會受到未預(yù)期的影響。總之, 不要嘗試在遍歷過程中對原數(shù)組進(jìn)行任何修改,雖然規(guī)范對這樣的操作進(jìn)行了詳細(xì)的定義,但為了可讀性和可維護(hù)性,請不要這樣做。
Array.prototype.forEach()為數(shù)組中的每個(gè)元素執(zhí)行一次回調(diào)函數(shù)。Array.prototype.entries()返回一個(gè)數(shù)組迭代器對象,該迭代器會包含所有數(shù)組元素的鍵值對。Array.prototype.every()如果數(shù)組中的每個(gè)元素都滿足測試函數(shù),則返回 true,否則返回 false。Array.prototype.some()如果數(shù)組中至少有一個(gè)元素滿足測試函數(shù),則返回 true,否則返回 false。Array.prototype.filter()將所有在過濾函數(shù)中返回 true 的數(shù)組元素放進(jìn)一個(gè)新數(shù)組中并返回。Array.prototype.find()找到第一個(gè)滿足測試函數(shù)的元素并返回那個(gè)元素的值,如果找不到,則返回 undefined。Array.prototype.findIndex()找到第一個(gè)滿足測試函數(shù)的元素并返回那個(gè)元素的索引,如果找不到,則返回 -1。Array.prototype.keys()返回一個(gè)數(shù)組迭代器對象,該迭代器會包含所有數(shù)組元素的鍵。Array.prototype.map()返回一個(gè)由回調(diào)函數(shù)的返回值組成的新數(shù)組。Array.prototype.reduce()從左到右為每個(gè)數(shù)組元素執(zhí)行一次回調(diào)函數(shù),并把上次回調(diào)函數(shù)的返回值放在一個(gè)暫存器中傳給下次回調(diào)函數(shù),并返回最后一次回調(diào)函數(shù)的返回值。Array.prototype.reduceRight()從右到左為每個(gè)數(shù)組元素執(zhí)行一次回調(diào)函數(shù),并把上次回調(diào)函數(shù)的返回值放在一個(gè)暫存器中傳給下次回調(diào)函數(shù),并返回最后一次回調(diào)函數(shù)的返回值。Array.prototype.values()返回一個(gè)數(shù)組迭代器對象,該迭代器會包含所有數(shù)組元素的值。Array.prototype[@@iterator]()和上面的 values() 方法是同一個(gè)函數(shù)。在JavaScript中可以用prototype來擴(kuò)展已有類增加自己的方法,在這里提供對Array的擴(kuò)展可減少許多工作量。
<script> /* * 方法:Array.removeAt(Index) * 功能:刪除數(shù)組元素. * 參數(shù):Index刪除元素的下標(biāo). * 返回:在原數(shù)組上修改數(shù)組 */ Array.prototype.removeAt = function (Index) { if (isNaN(Index) || Index > this.length) { return false; } for (var i = 0, n = 0; i < this.length; i++) { if (this[i] != this[Index]) { this[n++] = this[i] } } this.length -= 1 } /* * 方法:Array.remove(obj) * 功能:刪除數(shù)組元素. * 參數(shù):要?jiǎng)h除的對象. * 返回:在原數(shù)組上修改數(shù)組 */ Array.prototype.remove = function (obj) { if (null == obj) { return; } for (var i = 0, n = 0; i < this.length; i++) { if (this[i] != obj) { this[n++] = this[i]; } } this.length -= 1; } /* * 方法:Array.Contains(obj) * 功能:確定某個(gè)元素是否在數(shù)組中. * 參數(shù):要查找的Object對象 * 返回:找到返回true,否則返回false; */ Array.prototype.Contains = function (obj) { if (null == obj) { return; } for (var i = 0, n = 0; i < this.length; i++) { if (this[i] != obj) { return true; } } return false; } /* * 方法:Array.IndexOf(obj) * 功能:搜索指定的Object,并返回第一個(gè)匹配項(xiàng)從零開始的索引 * 參數(shù):要查找的Object對象 * 返回:找到返回該元素在數(shù)組中的索引,否則返回-1 */ Array.prototype.IndexOf = function (obj) { if (null == obj) { return; } { for (var i = 0, n = 0; i < this.length; i++) { if (this[i] == obj) { return i; } } } return -1; } /* * 方法:Array.Clear() * 功能:消空數(shù)組元素. * 參數(shù):無. * 返回:空數(shù)組 */ Array.prototype.Clear = function () { this.length = 0; }</script>Array是類名,而不是對象名,所以不能直接用Array.slice。
Array.prototype:就是Array的原型. 內(nèi)置的類型可以通過prototype找到內(nèi)置的屬性方法,
Array.prototype.slice這句就是訪問Array的內(nèi)置方法slice
Array.prototype.slice.call(arguments,0) 這句里,就是把 arguments 當(dāng)做當(dāng)前對象.也就是說 要調(diào)用的是 arguments 的slice 方法,后面的 參數(shù) 0 也就成了 slice 的第一個(gè)參數(shù)slice(0)就是獲取所有.
slice 經(jīng)常用來將 array-like 對象轉(zhuǎn)換為 true array。在一些框架中會經(jīng)常有這種用法。
Array.prototype.slice.call(arguments)能將具有l(wèi)ength屬性的對象轉(zhuǎn)成數(shù)組.
Array.prototype.slice.call(arguments,0);將參數(shù)轉(zhuǎn)換成真正的數(shù)組. call的作用是改變this的指向,就相當(dāng)于arguments(自身沒有slice方法)調(diào)用了slice這個(gè)方法。 0就是start=0,end沒指定,所以返回整個(gè)arguments,這個(gè)時(shí)候就轉(zhuǎn)換成數(shù)組了。
Array.prototype.slice.apply的使用方法 arguments在JavaScript語法中是函數(shù)特有的一個(gè)對象屬性(Arguments對象),用來引用調(diào)用該函數(shù)時(shí)傳遞的實(shí)際參數(shù).apply():第一個(gè)參數(shù)是作用域,第二個(gè)是參數(shù)數(shù)組,其中第二個(gè)參數(shù)可以是數(shù)組實(shí)例,也可以是arguments對象。
apply和call的區(qū)別: 對于apply和call兩者在作用上是相同的,但兩者在參數(shù)上有區(qū)別的。 對于第一個(gè)參數(shù)意義都一樣,但對第二個(gè)參數(shù): apply傳入的是一個(gè)參數(shù)數(shù)組,也就是將多個(gè)參數(shù)組合成為一個(gè)數(shù)組傳入,而call則作為call的參數(shù)傳入(從第二個(gè)參數(shù)開始)。 如
func.call(func1,var1,var2,var3)//對應(yīng)的apply寫法為:func.apply(func1,[var1,var2,var3])其他例子:
var a={length:2,0:'first',1:'second'};Array.prototype.slice.call(a);// ["first", "second"]var a={length:2};Array.prototype.slice.call(a);// [undefined, undefined]slice有兩個(gè)用法,一個(gè)是String.slice,一個(gè)是Array.slice,第一個(gè)返回的是字符串,第二個(gè)返回的是數(shù)組
淺談javascript的Array.prototype.slice.call
JS 有趣的應(yīng)用 : Array.prototype.slice.call(arguments,0)
新聞熱點(diǎn)
疑難解答