最近常聽到其他非 JavaScript 的人在描述這個語言。
“沒節操”
但我想這只是要表達型別上的差異吧,還是有其他地方呢?還蠻容易戰起來的,書中的作者,相當的捍衛 JavaScript (隔著書都感受得到,準備進入戰場中...)
第二章,是統整 JavaScript 的重點,往後的章節會一一解釋內容。
第三章,是解說往後五本書(英文版五本)的內容。
Tony 這邊直接進入內容了。
可以檢視某值的行別,以字串回傳。
typeof null; // "object" 這什麼東西?應該是 "null" 吧!
typeof undefined; // "undefined"
typeof "haha"; // "string"
typeof 2; // "number"
typeof true; // "boolean"
typeof {a: 3}; // "object"
typeof Symble() // "symble"
null 的 typeof 是 "object",是死大臭蟲。沒救了。
那要怎麼取得 null 的判斷? null 是純值中唯一假值 (falsy)
var a = null;
(!a && typeof a === "object"); // true
typeof 還可以回傳 function。
typeof function a(){}; // "function"
function 和 array 同為 object 的子型別。
但是
typeof [1,2,3]; // "object"
function 被稱作為可呼叫的物件 ( callable object )。擁有 [[call]] 內部特性,讓他可以被調用 ( invoke )。
array 能以數值化的方式來索引(普通物件只能用字串),及維護了一個自動更新的 .length 特性。
變數 ( variables ) 沒有型別,值 ( values ) 才有型別。變數在不同時間點上可以持有任何值。
typeof typeof 42; // "string"
請看作 typeof(typeof 42)。因為 typeof 會回傳字串,所以裡面結果是字串,外面也就回傳字串。
var a ;
a; // undefined
b; // ReferenceError: b is not defined
還看得出兩者的差異。
但是使用 typeof。
var a;
typeof a; // "undefined"
typeof b; // "undefined"
這是 typeof 的安全防護。但還是很詭異啊。
擁有安全防護是好的,你不會希望妳的程式上線時跳出錯誤。
如果你要進入除錯模式,你會設定 var DEBUG = true;在 ( debug.js)內,接著在測試時引入這個檔案。
就進入了下面的判斷式內。
if (DEBUG) {
console.log( "Debugging is starting");
}
但程式上線拿掉測試檔案後,會因為找不到 DEBUG 就會直接跳錯誤。
你可以這樣用 typeof。
if (typeof DEBUG !== "undefined" ){
console.log( "Debugging is starting" );
}
同樣的方法可以用在內建 API 某個功能是否存在。
不使用 typeof 的另一個方案。利用全域變數都是全域物件的特性,在瀏覽器中,全域就是 windows 物件。
if (window.DEBUG) {
// ..
}
if (window.API) {
// ..
}
但如果範疇不是全域或不是 window,請還是使用 typeof。
(書中有更多介紹安全防護下,引入函數或 API 等等的處理方式,包含 IFEE 和 依存性注入(dependency injection) 的設計模式)
補充:
如果要判定值的各種狀態,可以用以下方法。
undeclared | undefined | assign null | assign value | |
---|---|---|---|---|
程式碼 | var a; | var a = null; | var a = 3; | |
console.log() | RefError | undefined | null | 3 |
typeof a | "undefined" | "undefined" | "object" | "number" |
!a | RefError | true | true | false |
console.log(),可以一次就看到 a 的狀態。
但如果要在表達式中判讀,需要在 typeof 和 !a 做排列組合。
(typeof a === "object" && !a); // 判斷 undefined 和 null