跳轉到

Basic concepts of Javascript

資料型別

原生值(primitive values)

有不可變 (immutable) 的特性,對其進行操作得到的結果會是一個新的原生值。截至目前為止的原生值如下:

  • String:(略)
  • Boolean:(略)
  • Undefined:是型別也是值,表示某變數已經宣告但還沒有賦值;若存取未宣告變數則會出現 ReferenceError
  • Null:須注意如果用 typeof 判斷 Null 的資料型別,會得到 Object
  • Number:不論整數或浮點數都是 Number 型別,其精確度介於 -(2^53 − 1) 與 2^53 − 1 之間;須注意 +Infinity-Infinity, 與 NaN 亦為此型別
  • BigInt:允許讓我們任意選擇其精準度,無法與 Number 型別的值交互使用
  • Symbol:為一個獨特(unique)值,可以用 Symbol() 工廠方法建立
物件(objects)

除了上述的原生值以外的存在皆是物件


暫時死區(TDZ, Temporal dead zone)

我們可以從變數的宣告理解何謂暫時死區:

  • var 的宣告會提升(hoisted)至函式作用域,並初始化為 undefined
  • letconst 宣告則會提升至區塊作用域,但不會初始化。此時這個變數存在於暫時死區,若存取此變數則會出現 ReferenceError

換個角度來看,const 作為一個常數本就不應變動,若賦值前後拿到不同值,就不符合常數原本設計的理念!


比較的區別

鬆散比較(loose equality):==

在比較之前會先強制轉換型別與值

嚴格比較(strict equality):===

在比較之前不會強制轉換型別與值。須注意當我們比較 +0 和 -0 時,嚴格比較會回傳 true;比較 NaN 和 NaN 會是 false

同值比較(strict equality):Object.is

顧名思義是在比較兩個值是不是相等,可以解決上述嚴格比較中的兩種問題


遍歷陣列的方法與其特性

  1. for:(略)
  2. for...of:遍歷的是 元素值 (value),會先檢查對象 [Symbol.iterator] 這個屬性,接著使用 [Symbol.iterator].next() 一個個迭代出值,來確保順序正確;但由於 Object 並不具備 [Symbol.iterator] 這個屬性,所以 for...of 並不能使用在 Object 上
  3. for...in:遍歷的是的 鍵值 (key)(陣列中的鍵值就是 索引 (index)),並有以下特性:
    • 當陣列中有空項目時,會忽略該項目
    • 會檢查對象的屬性是否 enumerable ,如果為真則會把這些屬性名稱全部迭代出來
          Array.prototype.foo = 1;
      
          let a = [1, 2, 3];
          for (let x in a) {
            console.log(x);
          }
          // 0 1 2 foo
      
    • String 型別作為鍵值
    • 並不保證遍歷的順序是正確的
  4. forEach:針對陣列中的元素執行提供的函式,但是不能使用 break 和  continue 跳出循環
  5. map:針對陣列中的元素執行提供的函式,並回傳新陣列
  6. filter過濾 掉沒有通過所提供函式的元素,並回傳新陣列
  7. every:測試 每一個 元素是否通過提供的函式,最終返回一個 布林值(Boolean),若其中有一個元素測試值為 false,就會提前結束
  8. some:同上,但若其中有一個元素測試值為 true,就會提前結束

立即調用函式 IIFE (Immediately Invoked Function Expression)


關於原型 (prototype)


Javascript 中的 this


event.targetevent.currentTarget 之差異

讓我們從 MDN 的定義比較兩者的區別,首先是 event.target 的定義:

The read-only target property of the Event interface is a reference to the object onto which the event was dispatched.

接著讓我們看到 event.currentTarget 的定義:

The currentTarget read-only property of the Event interface identifies the element to which the event handler has been attached.

也就是說當事件觸發時,event.target 作為觸發事件的元素,而 event.currentTarget 則是事件監聽器所監聽的元素。另外補充一點,在使用函式宣告式 (declaration) 時,this 相當於這裡的 event.currentTarget

參考資料