學習JavaScript 第二週
分支結構中的switch
switch(值&條件表示式){
case 值:
操作;
break;
case 值:
操作;
break;
...
default:
預設操作
}
switch根據值或條件表示式來找對應的值,然後再來執行操作。如果所有的值都沒有對應上,則執行default中的預設操作。
迴圈結構 do...while,相對於while先執行然後再判斷。所以至少執行一次。
按值傳遞
var a = 1; var b = a; b = 3; console.log(a, b); //=>a=1,b=3 深拷貝, 修改其中一個變數的值,不會影響到另一個變數的值var c = { name: 'sunck' }; var d = c; d.name = 'sunck.com'; console.log(c, d); //淺拷貝 c和d兩個物件的name屬性都成為了sunck.com
像下文陣列中的slice和contact獲取到的值,這一操作都是深拷貝,不會對原來資料產生影響。
變數提升& :
使用var關鍵字宣告變數的時候,瀏覽器預設會將變數的定義提前到當前作用域(函式作用域,或則全域性作用域)的最前面,但是值的定義會在引用資料型別定義的前面,而賦值留在當前,如果程式碼中遇到沒有用var 關鍵字就給變數賦值的,會汙染上一層作用域。
而重複宣告是指一個變數重複定義,後面的值會覆蓋前面的值。
for in 、forEach 、for of 這三種方式可以遍歷物件;
for in 的書寫格式
// 建立雜湊陣列 let arr = [];
arr["姓名"] = '周筆暢'; arr["職業"] = '歌手'; arr["年齡"] = 37; console.log(arr); for (let i in arr) { // 遍歷屬性名和屬性值 i為屬性名 arr[i]為屬性值 console.log(`${i}:${arr[i]}`); }
但是如果for in遍歷的是一個普通陣列的話,會把下標作為屬性名,而對應的資料作為屬性值。
forEach( )方法中的引數
// forEach 迭代(遍歷) 陣列 var arr = [1, 2, 3]; var sum = 0; arr.forEach(function(value, index, array) { console.log('每個陣列元素' + value); console.log('每個陣列元素的索引號' + index); console.log('陣列本身' + array); // 累加求和 sum += value; }) console.log(sum);
for of 的使用格式
// demo1 初體驗 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9], sum = 0; for (var element of arr) { sum += element; } console.log(sum); // demo2 用for/of 遍歷屬性名連線成的字串 var o = { x: 0, y: 1, z: 2 } keys = ''; for (var k of Object.keys(o)) { keys += k; } console.log(keys); //=> 'xyz' // demo3 用for/of 遍歷屬性值 var oSum = 0; for (var k of Object.values(o)) { oSum += k; } console.log(oSum); //=>3 // demo4 用兩個變數來接屬性名和屬性值 var pairs = ''; for (var [v, k] of Object.entries(o)) { pairs += v + k; } // demo5 查詢字串中字母出現的頻率 console.log(pairs); var frequency = {}; for (var letter of 'mississippi') { if (frequency[letter]) { frequency[letter]++; } else { frequency[letter] = 1; } } console.log(frequency);
陣列相對於變數可以儲存更多的資料,資料也可以陣列;它的建立有字面量法,使用建構函式建立,但是使用建構函式建立如果引數只為一個數字,則會建立一個那個數長度的空陣列。
雜湊陣列:可以自定義下標(本質是設定陣列物件的屬性名和屬性值),但是就沒有陣列長度了。
訪問陣列元素:arr[ '自定義屬性名' ]
遍歷雜湊陣列可以使用for in 。
雜湊陣列原理:將字串,計算出一個儘量不重複的數字(地址值),如果字串內容相同,則計算出的數字也一定是相同的
新增元素:將自定義下標交給hash演算法,得到一個數字(地址值),把我的元素儲存到了這個地址值之中
讀取元素:將指定的自定義下標交給hash演算法,得到一個和新增時完全相同的數字(地址值),根據地址值找到之前儲存的東西
拓展:js裡面一切的東西都是物件:除了undefined和null
常見的陣列的方法(部分)
API | 陣列中的API作用 |
---|---|
(非破壞性方法)arr.join( ) | 將陣列中的資料進行拼接,小看括號裡面的引數(字串)就是連線的字元。 |
(非破壞性方法) arr.concat( ) | 將陣列中的內容進行無縫拼接,裡面可以是一串資料(資料之間用逗號分隔),或直接是一個數組。 |
(非破壞性方法)arr.slice() | 將陣列進行切片,含頭不含尾,如果第二個引數不寫,則表示到末尾結束(包含末尾元素),如果是-n,則表示擷取到倒數第n個元素為止(第n個取得到)。 |
arr.splice( ) | 刪除:var dels=arr.splice(starti,n);//返回一個刪除的元素形成的陣列 插入:arr.splice(starti,0,值1,....);//1.新插入的元素佔領位置,其餘元素往後面移動;2.因為沒有刪除元素,所以返回的是一個空陣列;3.不要直接插入元素,不然會形成一個部分二維陣列。 替換:arr.aplice( starti,n,值1,... ) |
arr.reverse( ) |
釋放引用型別(
):瀏覽器有兩種垃圾回收的方法:標記清除法、引用計數法
標記清除法:函式中的變數,在函式執行完之後就會被銷燬釋放記憶體。
引用計數法:看對資料的引用次數是否為0,如果為0,就會回收;像定義了全域性變數但是從來未使用的那種,就要手動設定為null進行釋放記憶體。