我們在其他的程式語言中或許會使用 == 來比較兩個物件,但在 TypeScript 中,無論是使用 == 或是 === 是行不通的。
通常在比較兩個物件或比較兩個陣列是一見非常常見的事情,可是對於 JavaScript 或 TypeScript 而言,這是一個地雷區。一旦你用了,就踩雷了。
我們來看個例子吧:
console.log({a:123} == {a:123}); // False
console.log({a:123} === {a:123}); // False
console.log([] == []); // False
console.log([] === []); // False
console.log([1, 2] == [1, 2]); // False
console.log([1, 2] === [1, 2]); // False
上面那幾個例子都是很簡單的比較,可是得到的答案卻是很驚人!如果 Google 一下,有些人會建議使用 JSON.stringify(var1) === JSON.stringify(var2)
或是把物件 toString()
之後再來做比較。不過,這樣做會有風險。
我們來看個例子:
console.log(JSON.stringify({a:123}) === JSON.stringify({a:123})); // true
console.log(JSON.stringify({a:123}) == JSON.stringify({a:123})); // true
console.log({a:123}.toString() === {a:123}.toString()); // true
console.log({a:123}.toString() == {a:123}.toString()); // true
console.log({a:"123"}.toString() === {a:123}.toString()); // true
console.log({a:"123"}.toString() == {a:123}.toString()); // true
從上面例子不難發現,不論是用 ==
或是 ===
, 當所有的數字或文字都轉換成數字的時候,他還是會有超乎我們預期的事情發生的。
所以當我們在做物件比較時,我們可以考慮使用 deepEuqal, 他的安裝方式就直接使用 npm install deep-equal
就行了。
import * as deepEqual from "deep-equal";
console.log(deepEqual({a:123}, {a:123})); // true
console.log(deepEqual([1, 2], [1, 2])); // true
這樣一來,我們就可以去比較兩個物件了。
個人感想是,由於 TypeScript 與 JavaScript 其實有著很深遠的關係,所以基本上 JavaScript 的大部分程式碼都可以在 TypeScript 上寫而沒有問題,相對的, JavaScript 的雷區也就跟 TypeScript 很接近了!也因此,雖然我不喜歡 JavaScript, 但是還是必須多了解他一點才行阿。