Basic concepts of Javascript
資料型別¶
原生值(primitive values)¶
有不可變 (immutable) 的特性,對其進行操作得到的結果會是一個新的原生值。截至目前為止的原生值如下:
String:(略)Boolean:(略)Undefined:是型別也是值,表示某變數已經宣告但還沒有賦值;若存取未宣告變數則會出現ReferenceErrorNull:須注意如果用typeof判斷Null的資料型別,會得到ObjectNumber:不論整數或浮點數都是Number型別,其精確度介於-(2^53 − 1)與2^53 − 1之間;須注意+Infinity,-Infinity, 與NaN亦為此型別BigInt:允許讓我們任意選擇其精準度,無法與Number型別的值交互使用Symbol:為一個獨特(unique)值,可以用Symbol()工廠方法建立
物件(objects)¶
除了上述的原生值以外的存在皆是物件
暫時死區(TDZ, Temporal dead zone)¶
我們可以從變數的宣告理解何謂暫時死區:
var的宣告會提升(hoisted)至函式作用域,並初始化為undefinedlet和const宣告則會提升至區塊作用域,但不會初始化。此時這個變數存在於暫時死區,若存取此變數則會出現ReferenceError
換個角度來看,const 作為一個常數本就不應變動,若賦值前後拿到不同值,就不符合常數原本設計的理念!
比較的區別¶
鬆散比較(loose equality):==¶
在比較之前會先強制轉換型別與值
嚴格比較(strict equality):===¶
在比較之前不會強制轉換型別與值。須注意當我們比較 +0 和 -0 時,嚴格比較會回傳 true;比較 NaN 和 NaN 會是 false
同值比較(strict equality):Object.is¶
顧名思義是在比較兩個值是不是相等,可以解決上述嚴格比較中的兩種問題
遍歷陣列的方法與其特性¶
for:(略)for...of:遍歷的是元素值 (value),會先檢查對象[Symbol.iterator]這個屬性,接著使用[Symbol.iterator].next()一個個迭代出值,來確保順序正確;但由於 Object 並不具備[Symbol.iterator]這個屬性,所以for...of並不能使用在 Object 上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型別作為鍵值 - 並不保證遍歷的順序是正確的
forEach:針對陣列中的元素執行提供的函式,但是不能使用break和continue跳出循環map:針對陣列中的元素執行提供的函式,並回傳新陣列filter:過濾 掉沒有通過所提供函式的元素,並回傳新陣列every:測試每一個元素是否通過提供的函式,最終返回一個布林值(Boolean),若其中有一個元素測試值為false,就會提前結束some:同上,但若其中有一個元素測試值為true,就會提前結束
立即調用函式 IIFE (Immediately Invoked Function Expression)¶
關於原型 (prototype)¶
Javascript 中的 this¶
event.target 與 event.currentTarget 之差異¶
讓我們從 MDN 的定義比較兩者的區別,首先是 event.target 的定義:
The read-only
targetproperty of theEventinterface is a reference to the object onto which the event was dispatched.
接著讓我們看到 event.currentTarget 的定義:
The
currentTargetread-only property of theEventinterface identifies the element to which the event handler has been attached.
也就是說當事件觸發時,event.target 作為觸發事件的元素,而 event.currentTarget 則是事件監聽器所監聽的元素。另外補充一點,在使用函式宣告式 (declaration) 時,this 相當於這裡的 event.currentTarget。
參考資料¶
- Events | jQuery API Documentation
- Event: target property - Web APIs | MDN (mozilla.org)
- Event: currentTarget property - Web APIs | MDN (mozilla.org)