1. 引用類型判斷:
var a = {}; var b = []; console.log(typeof a); // object console.log(typeof b); // object
JavaScript中的對象有兩種類型,一種是普通對象,一種是數組對象。這兩種對象使用typeof運算符得到的結果都是"object",為了正確地判斷一個變量是否為數組類型,可以使用instanceof運算符:
console.log(a instanceof Object); // true console.log(b instanceof Array); // true
2. 變量聲明方式:
function foo() { var a=b=c=d=2; } foo(); console.log(a); // 報錯 console.log(b); // 報錯 console.log(c); // 2 console.log(d); // 2
在JS中將一個未聲明的變量進行賦值時,JS自動把這個變量聲明為全局變量并進行賦值。當變量在函數內進行聲明時,如果未使用var聲明該變量,JS會將其作為全局變量聲明,容易造成變量污染。正確的做法應該是使用var顯式地定義變量:
function foo() { var a = 2; var b = 2; var c = 2; var d = 2; } foo(); console.log(a); // 報錯 console.log(b); // 報錯 console.log(c); // 2 console.log(d); // 2
3. 嚴格模式:
"use strict"; function foo() { // "use strict"; a = 2; } foo(); console.log(a); // 報錯
在JavaScript中,使用"use strict"進行聲明會開啟嚴格模式,它能夠幫助我們避免一些不嚴謹的寫法,從而提高代碼的健壯性。開啟嚴格模式時,未被聲明的變量將不會被自動地創建為全局變量,而是會直接報錯。在上面的例子中,"a = 2"這句語句沒有使用var聲明變量,如果不使用嚴格模式可能會自動將a賦值為全局變量,使用嚴格模式后這樣的代碼就會直接報錯。
4. 函數參數默認值:
function foo(x) { x = x || 0; console.log(x); } foo(); // 0 foo(1); // 1
在JavaScript中,如果函數調用時沒有為參數傳遞值,則參數會賦值為undefined,但有時候我們希望函數在沒有傳遞參數時,能夠使用默認值。在ES6中,我們可以這樣寫:
function foo(x = 0) { console.log(x); } foo(); // 0 foo(1); // 1
5. 變量類型轉換:
console.log(1 + "2"); // "12" console.log(1 - "2"); // -1 console.log("1"=="1.0"); // true
在JS中,有時候我們需要將變量的類型進行轉換,但是類型轉換時容易出現意外的結果,比如上面的例子中,1 + "2"的結果為"12",這是因為1被轉化為了字符串"1",然后進行了字符串拼接。如果我們希望進行數值運算,則需要將字符串轉化為數值類型:
console.log(1 + parseInt("2")); // 3
總之,在開發JavaScript應用時,要注意這些細節問題,這樣才能寫出更加健壯、魯棒的代碼。