1. 程式人生 > >javascript入門篇

javascript入門篇

這裡只記錄需要在意的點,不做長篇大論的抄錄
1.
JavaScript 是一種動態型別語言,也就是說,變數的型別沒有限制,變數可以隨時更改型別。

var a = 1;
a = 'hello';
上面程式碼中,變數a起先被賦值為一個數值,後來又被重新賦值為一個字串。第二次賦值的時候,因為變數a已經存在,所以不需要使用var命令。

如果使用var重新宣告一個已經存在的變數,是無效的。

var x = 1;
var x;
x // 1
上面程式碼中,變數x聲明瞭兩次,第二次宣告是無效的。

但是,如果第二次宣告的時候還進行了賦值,則會覆蓋掉前面的值。

var x = 1;
var x = 2;

// 等同於

var x = 1;
var x;
x = 2;

2.變數提升
JavaScript 引擎的工作方式是,先解析程式碼,獲取所有被宣告的變數,然後再一行一行地執行。這造成的結果,就是所有的變數的宣告語句,都會被提升到程式碼的頭部,這就叫做變數提升(hoisting)。

console.log(a);
var a = 1;
上面程式碼首先使用console.log方法,在控制檯(console)顯示變數a的值。這時變數a還沒有宣告和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因為存在變數提升,真正執行的是下面的程式碼。

var a;
console.log(a);
a = 1;
最後的結果是顯示undefined,表示變數a已宣告,但還未賦值。

3.識別符號

識別符號(identifier)指的是用來識別各種值的合法名稱。最常見的識別符號就是變數名,以及後面要提到的函式名。JavaScript 語言的識別符號對大小寫敏感,所以a和A是兩個不同的識別符號。

識別符號有一套命名規則,不符合規則的就是非法識別符號。JavaScript 引擎遇到非法識別符號,就會報錯。

簡單說,識別符號命名規則如下。

第一個字元,可以是任意 Unicode 字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)。
第二個字元及後面的字元,除了 Unicode 字母、美元符號和下劃線,還可以用數字0-9。
下面這些都是合法的識別符號。

arg0
_tmp
$elem
π
下面這些則是不合法的識別符號。

1a // 第一個字元不能是數字
23 // 同上
*** // 識別符號不能包含星號
a+b // 識別符號不能包含加號
-d // 識別符號不能包含減號或連詞線
中文是合法的識別符號,可以用作變數名。

var 臨時變數 = 1;
JavaScript 有一些保留字,不能用作識別符號:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。

switch語句後面的表示式,與case語句後面的表示式比較執行結果時,採用的是嚴格相等運算子(=),而不是相等運算子(),這意味著比較時不會發生型別轉換。

var x = 1;

switch (x) {
case true:
console.log(‘x 發生型別轉換’);
break;
default:
console.log(‘x 沒有發生型別轉換’);
}
// x 沒有發生型別轉換
上面程式碼中,由於變數x沒有發生型別轉換,所以不會執行case true的情況。這表明,switch語句內部採用的是“嚴格相等運算子”,詳細解釋請參考《運算子》一節。

5.typeof運算子可以返回一個值的資料型別。

數值、字串、布林值分別返回number、string、boolean。

typeof 123 // “number”
typeof ‘123’ // “string”
typeof false // “boolean”
函式返回function。

function f() {}
typeof f
// “function”
undefined返回undefined。

typeof undefined
// “undefined”
利用這一點,typeof可以用來檢查一個沒有宣告的變數,而不報錯。

v
// ReferenceError: v is not defined

typeof v
// “undefined”
上面程式碼中,變數v沒有用var命令宣告,直接使用就會報錯。但是,放在typeof後面,就不報錯了,而是返回undefined。

實際程式設計中,這個特點通常用在判斷語句。

// 錯誤的寫法
if (v) {
// …
}
// ReferenceError: v is not defined

// 正確的寫法
if (typeof v === “undefined”) {
// …
}
物件返回object。

typeof window // “object”
typeof {} // “object”
typeof [] // “object”
上面程式碼中,空陣列([])的型別也是object,這表示在 JavaScript 內部,陣列本質上只是一種特殊的物件。這裡順便提一下,instanceof運算子可以區分陣列和物件。instanceof運算子的詳細解釋,請見《面向物件程式設計》一章。

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true
null返回object。

typeof null // “object”
null的型別是object,這是由於歷史原因造成的。1995年的 JavaScript 語言第一版,只設計了五種資料型別(物件、整數、浮點數、字串和布林值),沒考慮null,只把它當作object的一種特殊值。後來null獨立出來,作為一種單獨的資料型別,為了相容以前的程式碼,typeof null返回object就沒法改變了。

6.null 與undefine

null與undefined都可以表示“沒有”,含義非常相似。將一個變數賦值為undefined或null,老實說,語法效果幾乎沒區別。

var a = undefined;
// 或者
var a = null;
上面程式碼中,變數a分別被賦值為undefined和null,這兩種寫法的效果幾乎等價。

在if語句中,它們都會被自動轉為false,相等運算子(==)甚至直接報告兩者相等。

if (!undefined) {
console.log(‘undefined is false’);
}
// undefined is false

if (!null) {
console.log(‘null is false’);
}
// null is false

undefined == null
// true
區別是這樣的:null是一個表示“空”的物件,轉為數值時為0;undefined是一個表示"此處無定義"的原始值,
轉為數值時為NaN。

Number(undefined) // NaN
5 + undefined // NaN
Number(null) // 0
5 + null // 5

null表示空值,即該處的值現在為空。呼叫函式時,某個引數未設定任何值,這時就可以傳入null,表示該引數為空。比如,某個函式接受引擎丟擲的錯誤作為引數,如果執行過程中未出錯,那麼這個引數就會傳入null,表示未發生錯誤。

undefined表示“未定義”

7.布林值

如果 JavaScript 預期某個位置應該是布林值,會將該位置上現有的值自動轉為布林值。轉換規則是除了下面六個值被轉為false,其他值都視為true。

undefined
null
false
0
NaN
""或''(空字串)