JavaScript Tips 2
Nov 22, 2020
Object.prototype.toString
可以透過 Object.prototype.toString
來取得每一個物件的是屬於哪個子分類(Class)
Object.prototype.toString.call('foo'); // "[object String]"
Object.prototype.toString.call(1); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"Object.prototype.toString.call([1, 2, 3]); // "[object Array]"
Object.prototype.toString.call({ foo: 'bar' }); // "[object Object]"
Object.prototype.toString.call(function for() {}); // "[object Function]"Object.prototype.toString.call(/for/i); // "[object RegExp]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(Symbol('foo')); // "[object Symbol]"
RegExp
只有一種狀況會使用RegExp
物件包裹器,而非直接用字面值。
就是必須「動態地」為正規表達式建立範式。
原生的原型
不要任意修改預設的原生的原型(Object.prototype
)。
這種技巧稱為猴子補丁(monkey patching),它會破壞封裝。擴充內建原型的唯一合理理由,就是反向移植新版 JavaScript 引擎的功能,例如 Array.forEach
。
之後會特別寫一篇關於原型鍊的文章。
逗號運算式
(foo, f) => f(foo), bar(...args)
這用了一種叫逗號運算符,這個運算符的作用是可以組合多個表達式,變成單一個表達式。
運算求值的順序是從左至右,可以用兩個以上的表達式。一般在使用這個運算符會用小括號框住外面。
也就是說上面的f(foo), bar(...args)
,實際上是相當於先執行f(foo)
,然後執行bar(...args)
,最後的箭頭函式的回傳是後面這個表達式的求值結果。
逗號運算符在簡單的if...else
語句會看到有人用來作簡寫語法:
function f(){
if(x){
foo()
return bar()
} else {
return 1
}
}
可以用逗號運算符簡寫為下面的樣子:
function f(){return x ? (foo(), bar()) : 1}