iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0

最近常聽到其他非 JavaScript 的人在描述這個語言。

“沒節操”

但我想這只是要表達型別上的差異吧,還是有其他地方呢?還蠻容易戰起來的,書中的作者,相當的捍衛 JavaScript (隔著書都感受得到,準備進入戰場中...)

第二章,是統整 JavaScript 的重點,往後的章節會一一解釋內容。
第三章,是解說往後五本書(英文版五本)的內容。

Tony 這邊直接進入內容了。

內建型別

  • null
  • undefined
  • string
  • number
  • boolean
  • object
  • symbol (ES6)
.typeof()

可以檢視某值的行別,以字串回傳。

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 特性。

藉由 typeof 了解 function 和 array 兩個子型別的定義。

作為型別的值

變數 ( variables ) 沒有型別,值 ( values ) 才有型別。變數在不同時間點上可以持有任何值。

  • JS 沒有強制施加的型別。
  • JS 引擎不會堅持一個變數必須永遠持有與初始型別相同的值。
  • 一個變數可能會在某個指定述句後持有 string,下一個述句持有 number。
typeof typeof 42; // "string"

請看作 typeof(typeof 42)。因為 typeof 會回傳字串,所以裡面結果是字串,外面也就回傳字串。

未定義 ( undefined ) vs. 未宣告 ( undeclared )

  • undefined - 有宣告,沒賦值。
  • undeclared - 未宣告。
var a ;
a; // undefined
b; // ReferenceError: b is not defined

還看得出兩者的差異。

但是使用 typeof。

var a;
typeof a; // "undefined"
typeof b; // "undefined"

這是 typeof 的安全防護。但還是很詭異啊。

typeof undeclared

擁有安全防護是好的,你不會希望妳的程式上線時跳出錯誤。

如果你要進入除錯模式,你會設定 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) 的設計模式)

typeof unclared 是一個判斷引數是否存在後,避免跳出錯誤的防護機制。

補充:

如果要判定值的各種狀態,可以用以下方法。

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

參考資料

  1. 你所不知道的 JS
  2. 好想工作室讀書會

上一篇
Day2 - 程式設計簡介
下一篇
Day4 - 值(上)
系列文
你為什麼不問問神奇 JavaScript 呢?30

尚未有邦友留言

立即登入留言