深入理解數(shù)組內(nèi)置方法

數(shù)組的方法大概分es3员舵、es5、es6版本了捉兴,各個(gè)版本都有一些新的定義蝎困。
鑒于es5 已經(jīng)成為當(dāng)前主流標(biāo)準(zhǔn),所以不區(qū)分es3 和es5了倍啥,直接區(qū)分es5和es6禾乘。

es5數(shù)組內(nèi)置方法:
1,Array.prototype.push(itemX, itemY) ---向數(shù)組的末尾添加一個(gè)或更多元素虽缕,并返回新的長(zhǎng)度始藕。
2,Array.prototype.pop() --刪除并返回?cái)?shù)組的最后一個(gè)元素氮趋。
3伍派,Array.prototype.unshift(itemX, itemY) -- 向數(shù)組的開頭添加一個(gè)或更多元素,并返回新的長(zhǎng)度剩胁。
4诉植,Array.prototype.shift() -- 刪除并返回?cái)?shù)組的第一個(gè)元素。
5昵观,Array.prototype.concat(arrayX,arrayX,......,arrayX) --連接兩個(gè)或更多的數(shù)組晾腔,并返回結(jié)果,把后面的數(shù)組追加到第一個(gè)數(shù)組啊犬。
6灼擂,Array.prototype.join(指定分隔符) -- 把數(shù)組的所有元素放入一個(gè)字符串。元素通過(guò)指定的分隔符進(jìn)行分隔觉至。
6.1剔应,String.prototype.split(指定分隔符) -- 把字符串通過(guò)指定分隔符形成數(shù)組
7,Array.prototype.reverse() -- 顛倒數(shù)組中元素的順序。
8领斥,Array.prototype.sort(sortby) --對(duì)數(shù)組的元素進(jìn)行排序
8嫉到,Array.prototype.slice(start, end) --從某個(gè)已有的數(shù)組返回選定的元素
9,Array.prototype.splice(index,howmany,item1,.....,itemX) --刪除元素月洛,并向數(shù)組添加新元素何恶。
10,Array.prototype.toString() --把數(shù)組轉(zhuǎn)換為字符串嚼黔,并返回結(jié)果细层。
11,Array.prototype.toLocaleString() --把數(shù)組中每一元素轉(zhuǎn)換為本地字符串唬涧,再拼接疫赎,返回結(jié)果,主要是時(shí)間類碎节。
12捧搞,Array.prototype.valueOf --返回?cái)?shù)組對(duì)象的原始值,內(nèi)部用,其實(shí)就是返回它自己
13狮荔,Array.prototype.toSource --返回該對(duì)象的源代碼胎撇。// 大部分不支持

新增方法(存在ie6-ie8不兼容問(wèn)題):

14,Array.prototype.forEach() --是Array新方法中最基本的一個(gè)殖氏,就是遍歷晚树,循環(huán)
15,Array.prototype.map() --原數(shù)組被“映射”成對(duì)應(yīng)新數(shù)組
16雅采,Array.prototype.filter() -- 根據(jù)過(guò)濾條件對(duì)原數(shù)組進(jìn)行過(guò)濾爵憎,形成新數(shù)組
17,Array.prototype.some() --是否“某些項(xiàng)”合乎條件 返回true/false
18婚瓜,Array.prototype.every() --是否都符合條件 返回true/false
19宝鼓,Array.prototype.indexOf() --包含指定元素的第一個(gè)位置
20,Array.prototype.lastIndexOf() --從數(shù)組后面找到該元素的第一個(gè)位置
21,Array.prototype.reduce() --迭代”闰渔、“遞歸(recursion)席函, 返回一個(gè)回調(diào)函數(shù)結(jié)果
22,Array.prototype.reduceRight() --從數(shù)組的末端開始迭代”、“遞歸(recursion), 返回一個(gè)回調(diào)函數(shù)結(jié)果

改變數(shù)組的方法有以下

push
pop
unshift
shift
splice
reverse
sort

重點(diǎn)講幾個(gè)方法冈涧,存在混淆點(diǎn)

 // push 可以向尾部添加1個(gè)或者多個(gè)
var arr = [1, 2, 3];
arr.push(4, 5) // arr = [1, 2, 3, 4, 5] 以前都是插入單個(gè)茂附,還未插入多個(gè)
// unshift 可以向頭部添加1個(gè)或者多個(gè)
arr.unshift(4, 5) // arr = [4, 5, 1, 2, 3, 4, 5]
//concat 并不會(huì)改變數(shù)組
var arr2 = [10, 11];
var arr3 = arr.concat(arr2) // arr 和 arr2并不會(huì)發(fā)生變化
//sort(sortby) sortby 是一個(gè)函數(shù),返回值為大于0 小于0 等于0
sortby = function(a, b){
  return a-b;
 //a -b > 0   a排在b后面
 // a-b = 0 不換位置
 // a-b < 0 a在b前面
}
// slice(start, end) start,end 說(shuō)明
/**
start 必選 ,end可選
*/
var arr = [1, 2, 3, 4];
//start 取值情況
var arr4 = arr.slice(0, 1) //   arr4 = 1  從0開始督弓,截取1位
var arr4 = arr.slice(1, 1) //   arr4 = 2  從1開始营曼,截取1位
var arr4 = arr.slice(-1, 1) //   arr4 = 4  從倒數(shù)第一位開始,截取1位
var arr4 = arr.slice(5, 1) //   arr4 = []  超出數(shù)組長(zhǎng)度愚隧,返回空數(shù)組
// end 取值情況
var arr4 = arr.slice(1) //   arr4 = [2, 3, 4]  end為空蒂阱,從第一位開始,截取剩下的元素
var arr4 = arr.slice(1, 0) // arr4 = [] ,截取0個(gè)元素時(shí),返回空數(shù)組
var arr4 = arr.slice(1,10) //arr4 = [2, 3, 4]  end超出數(shù)組長(zhǎng)度時(shí)录煤,截取剩下的元素
var arr4 = arr.slice(1, -1) //arr4 = [2, 3] end為負(fù)數(shù)時(shí)鳄厌,截取到數(shù)組長(zhǎng)度+負(fù)數(shù)的位置,不包含該位置
var arr4 = arr.slice(-1, -1) // arr4 = [] start end 均為負(fù)數(shù)時(shí)妈踊,以start為開始了嚎,若end在start前返回空,在start后廊营,獲取剩下元素

//splice(index,howmany,item1,.....,itemX)
/**
index: 起始位
howmany: 多少個(gè)
item1...itemx:插入值
*/
var arr = [1, 2, 3, 4];
arr.splice(0) // arr = [] 為一個(gè)或兩個(gè)參數(shù)時(shí)歪泳,是刪除操作
arr.splice(1) // arr = [2, 3, 4]
arr.splice(-1) // arr = [1, 2, 3] 當(dāng)index為負(fù)值時(shí),則從length+index位開始計(jì)算
arr.splice(-2, 1) // arr = [1, 2, 4] 
arr.splice(1, 0) //arr = [1, 2, 3 ,4] 為0時(shí)不刪除
arr.splice(1, 5) // arr = [1] 超出長(zhǎng)度露筒,以最大長(zhǎng)度計(jì)算
arr.splice(1, 1, 10) // arr = [1,10, 3, 4] 先刪除呐伞,然后在指定位置插入值
arr.splice(1, 1, 10,20) // arr = [1,10慎式,20, 3, 4]  有多個(gè)則依次插入多個(gè)
arr.splice(10, 1, 555) // arr = [1, 2, 3, 4, 555] 起始值超出長(zhǎng)度時(shí)伶氢,則在最后面插入

es6的方法演示及兼容寫法

  1. forEach(callback,[ thisObject])
    callback回調(diào)函數(shù) = function (item, index ,array)
    thisObject 一個(gè)可選的上下文參數(shù)(改變回調(diào)函數(shù)里面的this指向)
  var data = {
  users: ['張含韻', '李小璐', '白百何'],
  sendEmails: function(user){
    if(this.isValidUser(user)){
      console.log('你好' + user);
    } else {
      console.log('你好不是本家人')
    }
  },
  isValidUser: function(user){
    return /^張/.test(user)
  }
}
data.users.forEach(data.sendEmails, data)
 //此時(shí),如果不帶data,會(huì)報(bào)錯(cuò)的瞬捕,執(zhí)行sendEmails方法用到this.isValidUser方法鞍历,此時(shí)this指向window,帶了data肪虎,指向data
//jquery中也有each方法。容易混淆
$.each([], function(index, item, array) {
    // ...
});
//回調(diào)函數(shù)中的參數(shù) 第一位和第二位與數(shù)組中的順序恰恰相反惧蛹,使用的時(shí)候要注意一下
// 兼容IE6-8
if(typeof Array.prototype.forEach !== 'function'){
  Array.prototype.forEach = function(fn, context){
    for(var k = 0, len = this.length; k < len; k++){
      if(typeof fn === 'function' && Object.prototype.hasOwnProperty.call(this, k)){
        fn.call(context, this[k], k, this)
      }
    }
  }
}
//this指向的是調(diào)用的數(shù)組
  1. array.map(callback,[ thisObject]); //返回新數(shù)組
[].map(function(value, index, array) {
    // ...
});
var arr = [1, 2, 3];
var arr2 = arr.map(function(value, index, array){
   return value  * 2 // 必須要return 否者返回 undefined
})
// arr2  = [2, 4, 6]
// 兼容IE6-8
if(typeof Array.prototype.map != 'function'){
  Array.prototype.map = function(fn, context) {
    var arr = [];
    if(typeof fn === 'function' ){
      for(var k = 0, len = this.length; k < len; k++){
          arr.push(fn.call(context, this[k], k, this))
      }
    }
    return arr;
  }
}

3.array.filter(callback,[ thisObject]); //返回符合條件的新數(shù)組
if(typeof Array.prototype.map != 'function'){
Array.prototype.map = function(fn, context) {
var arr = [];
if(typeof fn === 'function' ){
for(var k = 0, len = this.length; k < len; k++){
fn.call(context, this[k], k, this) && arr.push(this[k]) //fn返回為真 則插入該值
}
}
return arr;
}
}

  1. array.some(callback,[ thisObject]); // 其中某項(xiàng)符合扇救, 返回true/false
  var arr = [1, 4, 8];
  var result = arr.some(function(item, index ,array){
      if(item > 4){
        return true;
      }
  })
  result === true
// 兼容IE6-8
if(typeof Array.prototype.some!= 'function'){
  Array.prototype.some = function(fn, context) {
    var passed = false;
    if(typeof fn === 'function'){
      for(var k = 0, len = this.length; k < len; k++){
        if(passed === true) {
          break;
        } 
        passed = !!fn(context, this[k], k, this);
      }
    }
return passed
  }
}
  1. every(callback,[ thisObject]); //全部符合,返回true/false
   var arr = [1, 4, 8];
  var result = arr.every(function(item, index ,array){
      if(item > 4){
        return true;
      }
  })
  result === false
// 兼容IE6-8
if(typeof Array.prototype.every!= 'function'){
  Array.prototype.every= function(fn, context) {
    var passed = true;
    if(typeof fn === 'function'){
      for(var k = 0, len = this.length; k < len; k++){
        if(passed === false) {
          break;
        } 
        passed = !!fn(context, this[k], k, this);
      }
    }
    return passed
  }
}
  1. array.indexOf(searchElement[, fromIndex])
    indexOf方法在字符串中自古就有香嗓,string.indexOf(searchString, position)迅腔。數(shù)組這里的indexOf方法與之類似。
    返回整數(shù)索引值靠娱,如果沒(méi)有匹配(嚴(yán)格匹配)沧烈,返回-1. fromIndex可選,表示從這個(gè)位置開始搜索像云,若缺省或格式不合要求锌雀,使用默認(rèn)值0,我在FireFox下測(cè)試迅诬,發(fā)現(xiàn)使用字符串?dāng)?shù)值也是可以的腋逆,例如"3"和3都可以。
var data = [2, 5, 7, 3, 5];

console.log(data.indexOf(5, "x")); // 1 ("x"被忽略)
console.log(data.indexOf(5, "3")); // 4 (從3號(hào)位開始搜索)

console.log(data.indexOf(4)); // -1 (未找到)
console.log(data.indexOf("5")); // -1 (未找到侈贷,因?yàn)? !== "5")
// 兼容IE6-8
if (typeof Array.prototype.indexOf != "function") {
  Array.prototype.indexOf = function (searchElement, fromIndex) {
    var index = -1;
    fromIndex = fromIndex * 1 || 0;

    for (var k = 0, length = this.length; k < length; k++) {
      if (k >= fromIndex && this[k] === searchElement) { //大于起始位且相等
          index = k;
          break;
      }
    }
    return index;
  };
}
  1. array.lastIndexOf(searchElement[, fromIndex])
    lastIndexOf方法與indexOf方法類似:只是lastIndexOf是從字符串的末尾開始查找惩歉,而不是從開頭。還有一個(gè)不同就是fromIndex的默認(rèn)值是array.length - 1而不是0.
if (typeof Array.prototype.lastIndexOf != "function") {
  Array.prototype.lastIndexOf = function (searchElement, fromIndex) {
    var index = -1, length = this.length;
    fromIndex = fromIndex * 1 || length - 1;

    for (var k = length - 1; k > -1; k-=1) {
        if (k <= fromIndex && this[k] === searchElement) {
            index = k;
            break;
        }
    }
    return index;
  };
}
var data = [2, 5, 7, 3, 5];

console.log(data.lastIndexOf(5)); // 4
console.log(data.lastIndexOf(5, 3)); // 1 (從后往前,索引值小于3的開始搜索)

console.log(data.lastIndexOf(4)); // -1 (未找到)
  1. array.reduce(callback[, initialValue])
    callback函數(shù)接受4個(gè)參數(shù):之前值撑蚌、當(dāng)前值上遥、索引值以及數(shù)組本身。initialValue參數(shù)可選争涌,表示初始值露该。若指定,則當(dāng)作最初使用的previous值第煮;如果缺省解幼,則使用數(shù)組的第一個(gè)元素作為previous初始值,同時(shí)current往后排一位包警,相比有initialValue值少一次迭代撵摆。
var sum = [1, 2, 3, 4].reduce(function (previous, current, index, array) {
  return previous + current;
});

console.log(sum); // 10

說(shuō)明:

因?yàn)閕nitialValue不存在,因此一開始的previous值等于數(shù)組的第一個(gè)元素害晦。
從而current值在第一次調(diào)用的時(shí)候就是2.
最后兩個(gè)參數(shù)為索引值index以及數(shù)組本身array.
執(zhí)行過(guò)程:
// 初始設(shè)置
previous = initialValue = 1, current = 2

// 第一次迭代
previous = (1 + 2) = 3, current = 3

// 第二次迭代
previous = (3 + 3) = 6, current = 4

// 第三次迭代
previous = (6 + 4) = 10, current = undefined (退出)

var matrix = [
  [1, 2],
  [3, 4],
  [5, 6]
];

// 二維數(shù)組扁平化
var flatten = matrix.reduce(function (previous, current) {
  return previous.concat(current);
});

console.log(flatten); // [1, 2, 3, 4, 5, 6]
// 兼容ie6-8
if (typeof Array.prototype.reduce != "function") {
  Array.prototype.reduce = function (callback, initialValue ) {
     var previous = initialValue, k = 0, length = this.length;
     if (typeof initialValue === "undefined") {
        previous = this[0];
        k = 1;
     }
     
    if (typeof callback === "function") {
      for (k; k < length; k++) {
         this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this));
      }
    }
    return previous;
  };
}
  1. array.reduceRight(callback[, initialValue])
    reduceRight是從數(shù)組的末尾開始實(shí)現(xiàn)
var data = [1, 2, 3, 4];
var specialDiff = data.reduceRight(function (previous, current, index) {
  if (index == 0) {
    return previous + current;
  }
  return previous - current;
});

console.log(specialDiff); // 0

// 初始設(shè)置
index = 3, previous = initialValue = 4, current = 3

// 第一次迭代
index = 2, previous = (4- 3) = 1, current = 2

// 第二次迭代
index = 1, previous = (1 - 2) = -1, current = 1

// 第三次迭代
index = 0, previous = (-1 + 1) = 0, current = undefined (退出)

if (typeof Array.prototype.reduceRight != "function") {
  Array.prototype.reduceRight = function (callback, initialValue ) {
    var length = this.length, k = length - 1, previous = initialValue;
    if (typeof initialValue === "undefined") {
        previous = this[length - 1];
        k--;
    }
    if (typeof callback === "function") {
       for (k; k > -1; k-=1) {          
          this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this));
       }
    }
    return previous;
  };
}

應(yīng)用場(chǎng)景舉例:
var eleDivs = document.getElementsByTagName("div");
Array.prototype.forEach.call(eleDivs, function(div) {
console.log("該div類名是:" + (div.className || "空"));
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末特铝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壹瘟,更是在濱河造成了極大的恐慌鲫剿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻轨,死亡現(xiàn)場(chǎng)離奇詭異灵莲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)殴俱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門政冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人线欲,你說(shuō)我怎么就攤上這事明场。” “怎么了李丰?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵苦锨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我趴泌,道長(zhǎng)舟舒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任踱讨,我火速辦了婚禮魏蔗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痹筛。我一直安慰自己莺治,他們只是感情好廓鞠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谣旁,像睡著了一般床佳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榄审,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天砌们,我揣著相機(jī)與錄音,去河邊找鬼搁进。 笑死浪感,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饼问。 我是一名探鬼主播影兽,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莱革!你這毒婦竟也來(lái)了峻堰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盅视,失蹤者是張志新(化名)和其女友劉穎捐名,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闹击,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镶蹋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拇砰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅忌。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖除破,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琼腔,我是刑警寧澤瑰枫,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站丹莲,受9級(jí)特大地震影響光坝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甥材,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一盯另、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洲赵,春花似錦鸳惯、人聲如沸商蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绪商。三九已至,卻和暖如春辅鲸,著一層夾襖步出監(jiān)牢的瞬間格郁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工独悴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留例书,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓刻炒,卻偏偏與公主長(zhǎng)得像决采,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子落蝙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容