iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
Modern Web

從零開始進入 JavaScript & TypeScript 的世界系列 第 19

第19天 - "比較" 的雷區

  • 分享至 

  • xImage
  •  

我們在其他的程式語言中或許會使用 == 來比較兩個物件,但在 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, 但是還是必須多了解他一點才行阿。


上一篇
第18天 - 比較
下一篇
第20天-物件的雷區
系列文
從零開始進入 JavaScript & TypeScript 的世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言