1. 程式人生 > 其它 >學習JavaScript 第二週

學習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獲取到的值,這一操作都是深拷貝,不會對原來資料產生影響。

 

 

變數提升&window全域性物件汙染&重複宣告

使用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進行釋放記憶體。