iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
Modern Web

30天入門JavaScript系列 第 7

【Day 7】陣列(二):各種陣列的處理方法

  • 分享至 

  • xImage
  •  

滿一周了,還有三周能堅持住嗎?

基本型別跟參考型別

前面講的布林、數字、字串屬於基本型別(Primitive Type),
而陣列跟往後講的函式跟物件屬於參考型別(Reference Type)

拿個例子來看兩種的差異

let strA = '早';
let strB = strA;
strA = '晚';
console.log(strB); //早

let arrA = [1, 2, 3];
let arrB = arrA;
arrA[0] = 100;
console.log(arrB); // [100, 2, 3]

基本型別的變數內容是值,當字串B=字串A時會copy一份到自己變數內(參考以下糞繪圖)

當字串A的值被改變時,字串B的內容不會改變。

然後是參考型別,此是變數內的內容不是陣列,而是一個指向陣列在記憶體中位置的參考

陣列B=陣列A時,copy的內容是記憶體位置,而改變陣列時陣列A跟陣列B都會改變。

let arrA = [1, 2, 3];
let arrB = arrA;
arrA = [4, 5, 6];
console.log(arrB); // [1, 2, 3]

但如果將陣列A指向新的陣列,陣列B還是指向原本的[1, 2, 3]陣列

陣列的拼接

當想要將兩個陣列合成一個時,可以直接將兩個陣列相加嗎?

let arrA = [1, 2, 3];
let arrB = [4, 5, 6];

let arrC = arrA + arrB;
console.log(arrC); //1,2,34,5,6  嗯?
console.log(typeof arrC); //string

答案是不行,兩個陣列被強制轉型成字串後拼起來了

要拼接陣列時使用concat()方法來作,會將括號內的內容加入陣列

let arrA = [1, 2, 3];
let arrB = [4, 5, 6];

let arrC = arrA.concat(arrB);
console.log(arrC); //[1, 2, 3 ,4 ,5 ,6]

//也可以一次串接多個內容
let arrD = [];
console.log(arrD.concat(0, arrA, arrB, 7, 8)); //[0 ,1, 2, 3 ,4 ,5 ,6 ,7 ,8 ]

ES6後新增了一個展開運算子(...) 可以把陣列內容展開成多個參數
串接陣列有更簡單的實作方式

let arrA = [1, 2, 3];
let arrB = [4, 5, 6];

let arrC = [...arrA, ...arrB];
console.log(arrC);//[1, 2, 3 ,4 ,5 ,6]

陣列的查找

尋找陣列內是否有特定的值,提供方法有三種

  • includes(值):陣列內含有值的話回傳true,否則回傳false
  • indexOf(值):回傳值在陣列內第一個出現的位置索引值,如果沒有則回傳-1
  • lastIndexOf(值):回傳值在陣列內最後一個出現的位置索引值,如果沒有則回傳-1

三種方法可以看情況來選擇使用

let arrA = [1, 2, 3, 4, 1, 5, 6];

console.log(arrA.includes(5)); //true
console.log(arrA.includes(9)); //false
console.log(arrA.indexOf(1)); //0
console.log(arrA.indexOf(9)); //-1
console.log(arrA.lastIndexOf(1)); //4

陣列的反轉

直接調用reverse()方法就可以了,簡單方便,
要注意的是跟上面的方法不同,reverse()會直接改變原陣列的內容

let arrA = [1, 2, 3, 4, 5];

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

陣列的裁切

slice()splice()兩個方法名字很像,要小心搞混

slice()方法能把陣列部分的內容拷貝一份出來
splice()方法則是把特定部分切除


let arrA = [1, 2, 3, 4, 5];

//slice()
arrB = arrA.slice(2); //把索引2以後的內容拷貝
console.log(arrB); //[3, 4, 5]
console.log(arrA); // [1, 2, 3, 4, 5]
arrC = arrA.slice(1, 4); //可以指定結束位置
console.log(arrC); //[2, 3, 4]

//splice()
arrA.splice(1, 2); //從索引1開始 切除兩個內容
console.log(arrA); //[1, 4, 5]

arrA = [1, 2, 3, 4, 5];

arrA.splice(2, 2, '三', '四'); //另可以在切除的位置加入新的內容
console.log(arrA); //[1, 2, "三", "四", 5]

陣列的拷貝

上面提到陣列是參考類型不能直接複製,如果想把陣列copy一份副本
可以用slice()方法跟展開運算子來實作

let arrA = [1, 2, 3, 4, 5];

let arrB = arrA.slice(); //不給索引值,可以直接拷貝一份給B
let arrC = [...arrA]; //或著用展開運算子

arrA[0] = 100;//改變陣列的內容

console.log(arrA); //[100, 2, 3, 4, 5]
console.log(arrB); //[1, 2, 3, 4, 5]
console.log(arrC); //[1, 2, 3, 4, 5]
//此時改變A的內容也不會影響B跟C了

其實還有一些常用的方法沒介紹,像是map()reduce()
但這些方法都會使用到函式(還沒介紹囧),看等函式介紹完後在此篇更新。

或是之後再發一篇(下),再這篇名稱改成(中)


上一篇
【Day 6】陣列(一):陣列 array簡介
下一篇
【Day 8】for、while迴圈
系列文
30天入門JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言