JavaScript Tips 2

--

Photo by Ken Cheung on Unsplash

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}

--

--

許聖泉 Michael Hsu
許聖泉 Michael Hsu

No responses yet