JavaScript學習筆記——基礎部分

某科學的五音不全發表於2020-12-27

JavaScript學習筆記——基礎部分

變數、資料型別與運算子

1.下面兩種賦值順序的結果是不同的

var x = "8" + 3 + 5;		// x = “835”
var y = 3 + 5 + "8";		// y = “88”

2.在 JavaScript 中,從前端頁面獲得的值都是字串型別

3.==與===分別為相等和嚴格相等。三等號要求資料型別和值都相等,雙等號只需要值相等即可,相等包含嚴格相等。

比較過程上,嚴格相等先比較兩個物件的資料型別是否相等,不相等則結束比較,返回 false ,相等在資料型別不同時,嘗試進行資料型別轉換。

而相等與嚴格相等僅適用於非物件型別。對於物件型別,相等或者嚴格相等比較的都是物件的引用,而不是具體的值,就是說,一個物件和其他任何物件都是不相等的,即使兩者屬性、值都相等。

物件的比較中,只有經過物件賦值後這兩個物件才相等,因為它們指向同一塊儲存地址。

4.將值設定為null以清空物件,但這之後,這個物件的型別仍然是物件。
類似地,也可以通過undefined來清空物件,這之後,這個物件的型別也是undefined.

  • undefined與null的值相等,但型別不相等。也就是:
    • (undefined === null) = false
    • (undefined == null) = true
  • 數字與undefined和null的運算結果不同
    • console.log(11 + null); // 11
    • console.log(11 + undefined); // NaN

5.函式名引用的是函式物件;函式名與括號的組合引用的是函式結果。
訪問沒有括號的函式將返回函式的定義。

6.“宣告提前”現象:在函式內部,變數不論在何處宣告,都應該看成是在最開始宣告,但賦值不會看成是在最開始賦值。

7.JavaScript允許重複變數的宣告,且採用宣告覆蓋的方式,即實參個數如果比形參少,那麼剩下的預設賦值為 undefined,如果實參傳的比形引數量多,那麼是全部都會被傳進去的,只不過沒有對應的形參可以引用(但可以用 arguments 來獲取剩下的引數)。

function test(arg1) {
    for(var i=0; i<arguments.length; i++) {
        console.log(arguments[i]);
    }
}
test(1,2); //輸出 1 2

8.變數與函式重名時,變數生效。

9.JavaScript的預解析:

  • 函式與變數在宣告時都會被置頂,但函式更先被宣告,且不會被變數宣告覆蓋,但是會被變數賦值覆蓋。
  • 變數的宣告與賦值寫在一起時,JavaScript引擎解析會將宣告與賦值拆成兩部分,宣告部分被置頂,賦值則保持在原來的位置。
  • 宣告過的變數不會再被重新宣告。
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
  var a = b = c = 9;
  console.log(a);
  console.log(b);
  console.log(c);
}

說明:由於預解析,f1的宣告被提前,第一行的f1呼叫有效。觀察f1內部實現,第一條語句的意思是定義一個區域性變數a和兩個全域性變數(這兩個全域性變數不是通過var來宣告的),其值均為9,故首先輸出三行9,f1()呼叫結束。接下來的兩行輸出全域性變數b和c,由於a是區域性變數,其作用域僅限於f1函式內,且在外部也沒有進行宣告,故在外部呼叫a會報錯。

10.變數的儲存問題

  • 基本型別的變數是存放在棧中的,進行b = a的賦值操作時,a與b獨立,改變a的值不會影響b.
  • 物件是存放在堆中的,定義物件變數(存放在棧中)a與b,將物件賦給a,再進行b = a的賦值操作時,a與b指向了堆中的同一個物件,因此改變a中某個成員的值時b做出同樣的改變;而定義一個內容與a、b完全相同的物件變數c時,a、b與c指向的是不同的物件。

11.JavaScript在ES5中無塊級作用域{}的概念,變數的作用域僅限於全域性變數和區域性變數,在ES6中加入了這一概念,這使得函式的巢狀變成可行。

12.JavaScript中的字串是不可變的,字串的所有方法都不會修改字串本身,操作完成時返回的是一個新的字串。

語句

if、do-while、while語句

同C語言語法。

for、for-in語句

1.for迴圈中在初始化表示式中定義的變數在for迴圈外仍然可以訪問到。

for(var i = 0; i < 10; i++) {
	alert(i);
}
alert(i);	// i = 10

2.for-in迴圈同Java中的增強for迴圈

陣列

1.建立陣列的兩種方式:

	var arr1 = new Array();
	var arr2 = [];

2.陣列型別變數的length屬性可以獲得陣列的長度,它是可讀可寫的,意味著可以通過修改length的值來達到改變陣列容量的目的。
擴容後,未定義的值預設為undefined.

函式

1.JavaScript中形參的數量可以和實參的數量不相同。多餘的實參會被忽略,預設的實參會被賦值為undefined,參與的運算結果為NaN.
2.無返回值的函式返回undefined.
3.return只能返回一個值。若返回多個值,則返回最後一個逗號後面的值。
4.不確定個數的引數傳遞可以使用儲存當前實參的偽陣列變數arguments來獲取。
5.函式的兩種宣告方式

  • 命名函式
function fn() {}
fn();
  • 匿名函式
var fn = function () {};
fn();

兩種宣告方式的最大區別是匿名函式是是函式表示式,函式在程式碼執行的到當前行的時候才被執行,fn才被賦值;而命名函式是函式的宣告,和 var 一樣,會被提前到程式碼最前面定義。

物件

物件的建立方法

物件字面量

這是最常用的建立物件的方法,通過新建一個鍵值對的集合(物件字面量)建立物件,如下:

var song = {
    name:"Liekkas",
      time:180,
      "song language":English,
      singer: {
        singerName:"Sofia Jannok",
            singerAge:30
    }
};

鍵值對中的鍵指的是屬性的名字,若其中含有空格,名字需要用雙引號包含在內。值指的是屬性的值,可以是基本型別:如字串,數字,布林型,也可以是一個物件。鍵值對內部使用冒號而非等號隔開,鍵值對之間用逗號隔開,最後一個鍵值對後面沒有逗號,所有的鍵值對在一個大括號中,最後一個右大括號後面應以分號結尾。

通過關鍵字new建立物件

通過new關鍵字建立物件也是一個常用的方法。如下:

var Store = new Object();    // 建立物件的一個例項
Store.name = "lofo Market";
Store.location = "NO.13 Five Avenue";
Store.salesVolume = 1000000;

通過上面的程式碼,我們就能建立一個名為Store的物件。

通過工廠方法建立物件

工廠方法就是通過函式建立物件,函式封裝了建立物件的過程。

這是一種通過函式建立物件的方法,函式封裝了物件的建立過程,建立新物件時只需要呼叫該函式即可。這種方法適合於一次建立多個物件。

// 物件的建立函式
function createStoreObject(name,location,salesVolume) {
    var store = new Object();
    store.name = name;
    store.locaion = location;
    store.salesVolume = salesVolume;
    store.display = function() {
          console.log(this.name);
    };
    return store;
}
// 利用該函式建立一個物件
var store1 = createStoreObject("panda express","No.1,People Street",200000);

這樣就建立了一個名為store1的物件,注意這個物件除了屬性之外還有一個方法display。要建立更多的類似store1的物件,直接呼叫該函式即可。

使用建構函式建立物件

上面雖然也是通過函式建立物件,但不是建構函式,只是普通函式。建構函式名必須以大寫字母開頭,函式體內沒有返回語句。

// 建構函式
function Store(name,location,salesVolume) {
    this.name = name;
    this.locaion = location;
    this.salesVolume = salesVolume;
}
// 建立物件的例項
var myStore = new Store("KeyExp","No.1,L.Street",540000);

上面的程式碼首先是Store物件的建構函式,然後用該建構函式建立了Store物件的一個例項myStore。

使用原型(prototype)建立物件

當我們建立一個函式時,函式就會自動擁有一個prototype屬性,這個屬性的值是一個物件,這個物件被稱為該函式的原型物件。也可以叫做原型。

當用new關鍵字加函式的模式建立一個物件時,這個物件就會有一個預設的不可見的屬性[[Prototype]],該屬性的值就是上面提到的原型物件。如下所示:
JavaScript 中每個物件都有一個屬性[[Prototype]],指向它的原型物件,該原型物件又具有一個自己的[[Prototype]],層層向上直到一個物件的原型為null。根據定義,null 沒有原型,並作為這個原型鏈中的最後一個環節。如下所示:
在這裡插入圖片描述
這種方法是對使用建構函式建立物件的改進,使用建構函式建立一個物件時,會把建構函式中的方法(上面的建構函式只有屬性的鍵值對,沒有方法)都建立一遍,浪費記憶體,使用原型不存在這個問題。

function Store() {};
Store.prototype.name = "SF Express";
Store.prototype.locaion = "Hong Kong";
Store.prototype.salesVolume = 1200000000;
// 建立物件
var myStore = new Store();
// 建立一個新的物件
var hisStore = new Store();
hisStore.name = "STO Express";    // 覆蓋了原來的name屬性

這種方法的好處是,建立一個新的物件時,可以更改部分屬性的值。

相關文章