JavaScript學習筆記——基礎部分
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屬性
這種方法的好處是,建立一個新的物件時,可以更改部分屬性的值。
相關文章
- JavaScript學習總結(一)基礎部分JavaScript
- CSS 基礎學習筆記CSS筆記
- node基礎學習筆記筆記
- Web基礎學習筆記Web筆記
- Redis基礎學習筆記Redis筆記
- Shell 學習筆記 基礎筆記
- Oracle基礎學習筆記Oracle筆記
- Java基礎學習筆記Java筆記
- JavaScript基礎筆記JavaScript筆記
- 安卓初學基礎學習筆記安卓筆記
- MySQL學習筆記【基礎篇】MySql筆記
- DI、IOC基礎學習筆記筆記
- 彙編基礎學習筆記筆記
- 基礎知識學習筆記筆記
- Python基礎學習筆記Python筆記
- 影象拼接基礎學習筆記筆記
- 類的基礎學習筆記筆記
- JavaWeb基礎-學習筆記02JavaWeb筆記
- Java基礎-學習筆記05Java筆記
- Java基礎-學習筆記06Java筆記
- Java基礎-學習筆記07Java筆記
- Java基礎-學習筆記04Java筆記
- Java基礎-學習筆記17Java筆記
- Linux基礎學習-Docker學習筆記LinuxDocker筆記
- 黑馬pink JavaScript學習筆記_JS基礎 Day5JavaScript筆記JS
- javascript基礎使用筆記JavaScript筆記
- 強化學習-學習筆記1 | 基礎概念強化學習筆記
- python基礎學習筆記(一)Python筆記
- Vue-Router基礎學習筆記Vue筆記
- RxJava 學習筆記 -- 基礎知識RxJava筆記
- Java學習筆記01 - JavaSE基礎Java筆記
- node 學習筆記 基礎入門筆記
- vue學習筆記【基礎篇一】Vue筆記
- Go 基礎語言學習筆記Go筆記
- Hive學習筆記:基礎語法Hive筆記
- 基礎 IO (Linux學習筆記)Linux筆記
- Vue學習計劃基礎筆記(六) – 元件基礎Vue筆記元件
- JavaScript學習筆記JavaScript筆記