前端筆記之JavaScript(五)關於陣列和字串那點事

mufengsm發表於2019-03-23

一、陣列

1.1陣列概念

陣列(array)是一個有序的資料集合。說白了,陣列就是一組數。陣列內部可以存放一個或多個單獨的資料,整體組成陣列。

定義陣列最簡單的方式:陣列字面量。

陣列的字面量[]”。習慣將陣列賦值給一個變數。

 

var arr = [];

var arr = [1,2,3,4,5,6,7,888,999,666];
arr[5] = 88; //把陣列下標為5的項改為88(設定陣列中的某一項)
console.log(arr);
console.log(arr[0]); //1
console.log(arr[8]); //999
console.log(arr[9]); //666
console.log(arr[12]); //undefined

 

陣列的字面量就是方括號,這是定義陣列最簡單的方式,至於更多建立陣列的方式,後續會提到。

裡面用,”逗號隔開每個值,最後一項沒有逗號。

變數arr就是一個陣列變數,裡面儲存的不是一個數字,而是一組數。可以使用下標(編號)或稱為“索引值(index)”,來精確訪問陣列中的某一項,下標從0開始。

 

陣列中,並不規定儲存相同型別的值,但是實際應用中,一般還是將相同型別的值儲存在一起。

下面的陣列中,儲存的記憶體型別都不一樣,是合法。

function fn(){
   alert("你好");
}
var arr = [3,4,"麼麼噠!",12,true,[],fn];
console.log(arr);
console.log(arr[6]);
arr[6]();//陣列下標為6的項,是以函式,是函式就能執行

 


 

1.2陣列length屬性

陣列有一個length屬性,英語是“長度”的意思,表示這個陣列的項的個數。

什麼是“屬性”,陣列是物件,物件就有屬性,屬性就是描述這個物件的特點、特徵、特性。用來表示一個物件的屬性,用“.”點來表示一個物件的屬性:

 

 arr.length;

 

var arr = [100,200,3,4,5,6,7,888,999,666,12345,3333,7777];
console.log(arr);
console.log(arr.length); //12 陣列中有幾項,就彈出幾
console.log(arr[0] + 1); //陣列第0項是100,所以100+1 =101
console.log(arr[arr.length-1]); //獲取陣列最後一項,陣列最大下標是arr.length-1,比arr.length-1還大是undefined

console.log(arr[100]); //undefined
arr[4] = "我是下標第4項";
arr.length = 18; //強行把陣列長度屬性改為18
arr[66] = 8989; //可以跳躍設定陣列,設定下標為66的項,並拉長了陣列
console.log(arr); 

 

寫一個小於陣列元素的值會縮短陣列,寫0會徹底清空陣列arr.length = 2;那麼只會有兩項,其餘都丟失了

 arr.length = 2;

 arr.length = 100;

案例:

用陣列判斷星期幾:

var arr = ["星期天","星期一","星期二","星期三","星期四","星期五","星期六"];
//假如今天是星期二、判斷1000天后是星期幾
var week = (1000 % 7 + 2) % 7;//0~6
console.log(week);
console.log(arr[week]);

隨機點名:

var stuName = ["王大錘","李鐵錘","二蛋","二狗子","黑貓","白貓","小丸子"];
var num = parseInt(Math.random() * stuName.length);
console.log(stuName[num]);
document.write('<h1>'+stuName[num]+'</h1>');

 


 

1.3陣列的遍歷

 

陣列裡面存放的是一組數,我們經常需要對這些數字都進行一些操作。

就需要用for迴圈語句來遍歷它。這是一個經典的for殼子:

 

var arr = [21,214,52,85,88,2,53,77,100,76];
for(var i = 0;i <= arr.length - 1;i++){
   if(arr[i] % 2 == 0){
       console.log(arr[i]); //取出每一項能整除2的資料,進行輸出
   }
}

//給陣列中的每一項都乘以2,陣列遍歷,計算後給每一項賦值
for(var i = 0;i <= arr.length - 1;i++){
   arr[i] *= 2;
}
console.log(arr);


//陣列樣本
var arr = [...];
//遍歷,計算偶數的個數
//計算平均數,平均數就是:總和/個數
var count = 0; //累加偶數個數
var sum = 0; //計算平均數
for(var i = 0;i < arr.length;i++){
    sum += arr[i]; //計算所有項的總和
    if(arr[i] % 2 == 0){
        count++; //如果是偶數,計數器+1
    }
}
alert("偶數的個數是:" + count);
console.log("平均數是:" + (sum / arr.length));

 


1.4陣列是引用型別

 var arr = [1,2,3,4];

 console.log(typeof arr); //object

 

用typeof arr 檢測,會發現陣列是Object,陣列是物件。

怎麼檢測陣列是陣列呢?高階JS再說。

 

基本型別:是儲存值,判斷時,是判斷值是否相等。 

var a = 1; //基本型別
var b = a; //會把a的值複製一個副本給b
console.log(a);//1
console.log(b);//1
console.log(a == b);//true,值是相等的

 

引用型別:儲存記憶體地址,比較時是判斷記憶體地址是否相等。

//都是陣列[1,2,3,4],記憶體、長度、項的位置完全一樣,但是不相等。
var a = [1,2,3,4];
var b = [1,2,3,4]; //因為陣列是引用型別,要比較地址,a和b變數指向地址不一樣,不能判相等。
console.log(a == b);//陣列中的值一樣,但引用型別判斷記憶體地址是否相同,所以是false

var a = [1,2,3,4];
var b = a; //b變數引用了a變數的值,所以都指向同一個記憶體地址
console.log(a == b);//true
var a = [1,2,3,4];
var b = a; //b變數引用了a變數的值,所以都指向同一個記憶體地址
b[0] = 88; //修改的是陣列b下標為0的項
console.log(a); //陣列a和b下標為0的項都被修改為88
console.log(b);
console.log(a == b);//true

 

 

var a = [1,2,3,4];
var b = a; //b變數引用了a變數的值,所以都指向同一個記憶體地址
b[0] = 88; //修改的是陣列b下標為0的項
console.log(a);
console.log(b);
b = [6,7,8,9]; //b現在是新的陣列(指向了新的記憶體地址),不再繼續影響a
console.log(a);
console.log(b);
console.log(a == b);//false

基本型別和引用型別講解:

 

 

 

如果a裡面儲存的是基本型別,那麼b=a就是把a的值複製一份給b

如果a裡面儲存的是引用型別,那麼b將指向a現在指向的記憶體地址,a的值不會複製一份,ab指向同一個記憶體地址。

 

在瀏覽器載入HTML頁面時,首先會開闢一個供js程式碼執行的環境-->"全域性作用域"(window/global)

棧記憶體(作用域):儲存基本資料型別的值;提供js程式碼執行的環境;

 

堆記憶體:儲存引用資料型別的值,首先會開闢一個新的記憶體空間,然後把程式碼儲存到這個空間中,最後把空間的地址給相關的變數-->我們把新開闢的這個記憶體空間稱之為"堆記憶體"

堆記憶體的作用:儲存引用資料型別值

 


二、陣列的方法

陣列是物件,現在要知道物件有屬性和方法。屬性已經介紹了,陣列有length屬性。

屬性:就是描述物件的特點。比如“性別”,“姓名”,“身高”,“體重”。

方法:就是物件能執行的事情。比如“吃飯”,“睡覺”,“摳腳打dota”。

現在就要學習陣列能執行什麼方法,看以下手冊:

 

2.1陣列的頭尾操作pop()push()shift()unshift()

push() 向陣列的末尾新增一個或多個元素,並返回新的長度。

unshift() 向陣列的開頭新增一個或多個元素,並返回新的長度。

shift() 刪除並返回陣列的第一個元素

pop() 刪除並返回陣列的最後一個元素

push()方法,向陣列的末尾新增一個或更多元素,並返回新的長度。

 

 var arr = ['','','西',''];

 arr.push('','','');

 console.log(arr);

unshift()向陣列的開頭新增一個或更多元素,並返回新的長度。

 

 var arr = ['','','西',''];

 arr.unshift('一萬','八萬','九萬');

 console.log(arr);

 

pop()刪除陣列的最後一項,只能刪最後一項,無法刪多項。並返回被刪除的元素。

 var arr = ['東','南','西','北'];

 var last = arr.pop(); //刪除陣列的最後一項

 console.log(last);    //pop有返回值,返回值就是被刪除的那一項

 arr.pop();

 arr.pop();

 console.log(arr);//["東"]

 

shift()刪除陣列的開頭項,只能刪第一項,無法刪多項。並返回被刪除的元素

 var arr = ["東","南","西","北"];

 var first = arr.shift(); //刪除陣列的第一項,並返回刪除的值

 console.log(first); //shift有返回值,返回值就是被刪除的那一項

 arr.shift();

 console.log(arr);

 

 


題目1:尾刪頭插

 

var arr = ["東","南","西","北"];
arr.unshift(arr.pop()); // ["北", "東", "南", "西"]
console.log(arr);
arr.unshift(arr.pop()); // ["西", "北", "東", "南"]
console.log(arr);
arr.unshift(arr.pop()); // ["南", "西", "北", "東"]
console.log(arr);
arr.unshift(arr.pop()); // ["東", "南", "西", "北"]
console.log(arr);
arr.unshift(arr.pop()); // ["北", "東", "南", "西"]
console.log(arr);

題目2:頭刪尾插

 

var arr = ["東","南","西","北"];
arr.push(arr.shift()); // ["南", "西", "北", "東"]
console.log(arr);
arr.push(arr.shift()); // ["西", "北", "東", "南"]
console.log(arr);
arr.push(arr.shift()); // ["北", "東", "南", "西"]
console.log(arr);
arr.push(arr.shift()); // ["東", "南", "西", "北"]
console.log(arr);
arr.push(arr.shift()); // ["南", "西", "北", "東"]
console.log(arr);

2.2陣列合並concat()

concat()合併兩個或更多的陣列,並返回結果。

該方法不會改變現有的陣列,而僅僅會返回被連線陣列的一個副本。

 

var arr1 = ["東","南","西","北"];
var arr2 = ['一條','二條'];
var arr = arr1.concat(arr2); //concat是把arr1和arr2合併為一個新陣列返回
console.log(arr1);//不變
console.log(arr2);//不變
console.log(arr); //合併的新陣列

concat的引數非常靈活,可以是陣列變數、陣列字面量、散的值也行。

 var arr3 = arr1.concat(arr2,['一筒','五條'],'么雞');

 console.log(arr);

 


2.3陣列擷取slice()

slice()方法可以從已有的陣列中返回選定的元素。

arr.slice(start,end)

引數

描述

start

必需。規定從何處開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。也就是說,-1 指最後一個元素,-2 指倒數第二個元素,以此類推。

end

可選。規定從何處結束選取。該引數是陣列片斷結束處的陣列下標。如果沒有指定該引數,那麼切分的陣列包含從 start 到陣列結束的所有元素。如果這個引數是負數,那麼它規定的是從陣列尾部開始算起的元素。

返回值返回一個新的陣列,包含從 start end(不包括該元素)的中的元素。

 

 var arr1 = ['','','西','','','',''];

 var arr2 = arr1.slice(1,4); //擷取下標123的為一個新陣列並返回

 console.log(arr2);  //["", "西", ""]

arr.slice(start,end) 返回一個新的陣列,包含從 start end(不包括該元素)的元素。

 

只寫start開始引數:

 var arr = ["","西","","","","",""];

 var arr2 = arr.slice(3); //從下標3開始,擷取到後面全部的項

 console.log(arr2);   // ["", "", "", ""]

 

slice(a,b)取出了b-a項:

從倒數第4倒數第2項(不包括倒數第2項)。""是倒數第1項。slice(a,b)取出了b-a

 var arr = ["","西","","","","",""];

 var arr2 = arr.slice(-4,-2); //從下標倒數第四個開始,擷取到倒數第二個

 console.log(arr2);   // ["", ""]

 

 var arr = ["","西","","","","",""];

 var arr2 = arr.slice(-4); //從下標倒數第四個開始,擷取到後面全部的項

 console.log(arr2);   // ["","","",""]

 

 var arr1 = ["","","西","","","",""];

 //var arr2 = arr1.slice(3,1); //順序錯誤

 var arr2 = arr1.slice(3,3);   //順序錯誤

 console.log(arr2);//[] 空陣列


2.3多功能splice()新增、刪除、替換

 array.splice(index,howmany,item1,.....,itemX)

 

引數

描述

index

必需。整數,規定新增/刪除專案的位置,使用負數可從陣列結尾處規定位置。

howmany

必需。要刪除的專案數量。如果設定為 0,則不會刪除專案。

item1, ..., itemX

可選。向陣列新增的新專案。

返回值

型別

描述

Array

包含被刪除專案的新陣列,如果有的話。

說明

splice() 方法可刪除從 index 處開始的零個或多個元素,並且用引數列表中宣告的一個或多個值來替換那些被刪除的元素。如果從陣列物件中刪除了元素,則返回的是含有被刪除的元素的陣列。

 

確定一件事:一旦應用,arr立即改變,並不需要重新賦值,換句話說,這個函式不返回新的陣列。

//**************替換一些項**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(3,2,"蘋果","香蕉"); //從陣列下標3開始,刪除兩項,改為後替換的內容
console.log(arr);

 

//**************替換一些項**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(3,2,"蘋果","香蕉","葡萄","橘子"); //從陣列下標3開始,刪除兩項,插入4項
console.log(arr);

 

// **************更改一些項**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(2,4,"哈哈"); //從陣列下標3開始,刪除兩項,插入1項
console.log(arr); //["A", "B", "哈哈", "G"]

 

// **************更改一個項**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(2,1,"哈哈"); //從陣列下標3開始,刪除兩項,插入1項
console.log(arr); //["A", "B", "哈哈", "D", "E", "F", "G"]

 

//**************刪除一些項**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(2,4); //沒有東西可以替換,直接刪除4項
console.log(arr); //["A", "B", "G"]

 

//**************插入一些項,但不刪除**********
var arr = ["A","B","C","D","E","F","G"];
arr.splice(2,0,"嘻嘻","哈哈"); //從下標2開始插入2項,不刪除
console.log(arr); //["A", "B", "嘻嘻", "哈哈", "C", "D", "E", "F", "G"]


 

splice依據引數的多少,和引數是什麼,有多功能。現在你要能反應過來。

刪除陣列的最後5項。

 arr.pop();

 arr.pop();

 arr.pop();

 arr.pop();

 arr.pop();

簡化為:

 for(var i = 1 ; i <= 5 ; i++){

  arr.pop();

 }

也可以:

 

var arr = ["A","B","C","D","E","F","G","H","I","J","K","L"];
//arr.splice(-5);
arr.splice(-5,5);         
console.log(arr);    

2.4倒序reverse();

reverse()方法就是立即讓陣列倒置:

 

var arr = ["A","B","C","D","E","F","G"];
arr.reverse();   //不需要賦值
console.log(arr);  //["G", "F", "E", "D", "C", "B", "A"]


2.5排序sort()

sort()方法排序

var arr = ["G","A","C","B","I","H","G","I","B"];
arr.sort();
console.log(arr);

//sort函式預設是按照字元順序排的,隱式將數字轉為string
//比字元編碼順序
var arr = [23,435,456,23,2,345,2,32,11,324,32,43,65,667,78,43];
arr.sort();
console.log(arr);

sort()裡面有一個引數,這個引數是一個函式。

 

var arr = [41,4,52,64,99,66,88,77,100,412,78,43,2];
// 升序排序,從小到大
arr.sort(function(a,b){
    //如果a要放在b前面,那麼return負數
    //如果a要放在b後面,那麼return正數
    //如果a和b不區分大小,那麼return 0
    if(a < b){
        return -1;  //滿足第一個條件,返回值是-1,a要排在b前面
    }else if(a > b){
        return 1;   //滿足第二個條件,返回值是1,a要排在b後面
    }else if(a == b){
        return 0;
    }
});
console.log(arr);

 

 

按五角星的個數排序:

var arr = ["★★★","★★★★★","★★","★","★★★★","★★★★","★★★★★★"];
arr.sort(function(a,b){
   // 若 a 小於 b,在排序後的陣列中 a 應該出現在 b 之前,則返回一個小於 0 的值。
   // 若 a 等於 b,則返回 0。
   // 若 a 大於 b,則返回一個大於 0 的值。
   if(a < b){
       return -1; //滿足第一個條件,返回值是-1,a在b前面
   }else if(a > b){
       return 1; //滿足第二個條件,返回值是1,a在b後面
   }else if(a == b){
       return 0;
   }
});
console.log(arr);


 

2.6陣列分割join()

join() 方法用於把陣列中的放入一個字串,並且可以通過指定的分隔符進行分隔的

var arr = [1,2,3,4,5,6,7];
var str = arr.join("★"); //轉為字串用新變數接收
console.log(str);

語法:

 var str = arr.join(分隔符);

 

如果不寫分隔符,預設用逗號分割:

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

 var str = arr.join();

 console.log(str);

 

 

如果是空字串""就不分割:

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

 var str = arr.join("");

 console.log(str);

 


三、字串的屬性和方法

3.1字串屬性

屬性length就是字串的長度

1 var str = "我們都非常喜歡JavaScript!希望能找到能帶你*****飛的工作。";

1 console.log(str.length);

中文、數字、英語字母、空格、特殊符號,都算1個長度


 

3.2字串方法

3.2.1 charAt()查詢字串

返回字串中指定下標位置的字元,下標從0開始

 //返回字串中指定下標位置的字元,下標從0開始

 console.log("abcdef".charAt(0)) ;//a

 console.log("abcdef".charAt(2)) ;//a

 

 "abcdef".charAt(0);  

 "abcdef".charAt(2) ;//c

 和陣列下標類似的。

var str = "abcdefg"
for(var i = 0 ; i < str.length ; i++){
    console.log(str.charAt(i));
}

 


 

3.2.2 indexOf()查詢字串下標

indexOf(檢索的字串,開始檢索的位置)

返回某個指定的字串值在字串中首次出現的下標位置(索引值)。

 console.log(str.indexOf("非常喜歡"));

 

如果要檢索的字串值沒有完全匹配的值,則該方法返回 -1

console.log(str.indexOf("喜歡呀"));

 


3.2.3 lastIndexOf()

該方法可返回一個指定的字串值最後出現的位置,在一個字串中的指定位置從後向前搜尋。

 console.log(str.lastIndexOf(""));


3.2.4 replace()替換

該方法用於在字串中用一些字元替換另一些字元,或替換一個與正規表示式匹配的子串。

 "abcdefghijka".replace("a","蘋果");//a替換乘蘋果,只替換一個

a替換乘蘋果,只替換一個

 


 

3.2.5 split()字串分割為陣列

方法用於把字串分割成陣列(字串→陣列),從什麼地方拆分,就是引數

 "我愛你親愛祖國人民幣".split("");  

 

 1嘻嘻2嘻嘻3嘻嘻4嘻嘻5嘻嘻6".split("嘻嘻")

 


3.2.6 substr()提取字串

方法可在字串中抽取從 start 下標開始的指定數目的字元  

"字串".substr(start,length)

start引數:開始下標,可以為正數,也可以為負數,-1最後一個,-2指倒數第二個,以此類推。

length引數:擷取總長度。可以不寫,直接擷取到最後。

 

var str1 = str.substr(4,9); //從下標4開始,擷取9個
var str2 = str.substr(-9,4);//從下標-9開始,擷取4個
var str3 = str.substr(-9); //從下標-9開始,擷取到最後
console.log(str1);
console.log(str2);
console.log(str3);


3.2.7 substring()提取字串

方法用於提取字串中介於兩個指定下標之間的字元。

"字串".substring(start,end); 不包括end引數只能是正數,都是索引值。

擷取時,從開始位置擷取到結束位置,不包含結束位置。在選擇開始位置之前,會先比較以下兩個引數的大小,其中小的作為start值,大的作為stop

var str = "我們都非常喜歡JavaScript!希望能找到能帶你*****飛的工作。";
var str1 = str.substring(4,9);    //從下標4開始,擷取到下標為9的位置(不包括結束)
// var str2 = str.substring(-9,4);//錯誤的,不能用負數
var str3 = str.substring(9,4);    //從下標4開始,擷取到下標為9的位置(不包括結束)
var str4 = str.substring(4);     //從下標4開始,擷取到最後
console.log(str1);
console.log(str3);
console.log(str4);


3.2.8 slice()字串擷取

方法可提取字串的某個部分,並以新的字串返回被提取的部分。(該方法在陣列中學習過)

一個新的字串。包括字串 stringObject start 開始(包括 start)到 end 結束(不包括 end)為止的所有字元。

 

var str = "我們都非常喜歡JavaScript!希望能找到能帶你*****飛的工作。";
var str1 = str.slice(4,9);  //從下標4開始,擷取到下標為9的位置(不包括結束)
var str2 = str.slice(-9,-4); //從下標-9開始,擷取到下標為-4的位置(不包括結束)
var str3 = str.slice(3); //從下標3開始,擷取到最後
console.log(str1);
console.log(str2);
console.log(str3);

三種擷取方法的相同和不同點:

 

引數

引數正負

第二個引數

slice

正:開始和結束的下標

負:從後往前數

兩個引數不能顛倒位置

可以為正,可以為負

可以不寫

substring

開始和結束的下標

兩個引數的大小,可以隨意互換

只能是正數

可以不寫

substr

第一個引數:是下標或者後面往前的位置

第二個引數:擷取長度

第一個引數:可以為負或正

可以不寫

substrsubstring不一樣:

 "我愛你親愛的祖國的人民幣".substr(6,2); //從下標6開始,擷取2個字元

 "我愛你親愛的祖國的人民幣".substring(6,8);//從下標6開始擷取到下標8

 


3.2.9 concat()字串拼接

方法用於連線兩個或多個陣列或字串。在陣列方法中已經學習過。

 

//該方法沒有改變原有字串,但是會返回新字串或陣列
var str1 = "你好";
var str2 = "世界";
var str = str1.concat(str2);
console.log(str);//你好世界

該方法沒有改變原有字串,但是會返回新字串或陣列


 

3.2.10大小寫轉換方法

toLowerCase() 方法用於把字串轉換為小寫。

toUpperCase() 方法用於把字串轉換為大寫。

不需要傳遞引數:將所有字串中的字母進行大小寫的轉換

 "abcdefg".toUpperCase()

 "ABCDEFG".toLowerCase()

 


 

相關文章