問題描述
在實現業務時,大量用到了 if(a === b)這樣的判斷,但有一個類似判斷一直進不去這個if條件, a === b 返回的一直是false,但是其他幾個類似判斷,都正常觸發條件。
原因分析
我們都知道 === 是嚴格相等,首先要兩個值的類型相等,無法觸發條件的這個判斷,a和b都是Array對象,且通過打印,看到數組中的元素是一樣的。於是寫了幾個測試判斷,如下:
通過上圖可以看到,對於javascript的基礎類型Number、String,如c2和d2都等於1,用c2===d2的結果就是true,但是對於高級類型Object和Array,即便它們的值相等,===返回的也是false,甚至於==也是false。
這實際上是javascript的語言特性:
javascript中Array也是對象,而==或===操作符只能比較兩個對象是否是同一個實例,也就是是否是同一個對象引用。圖中兩個數組顯然不是同一個對象實例,由於思維慣性,導致寫代碼的時候對不同數組也用了類似判斷,導致無法成功觸發條件。
解決方案
目前JavaScript沒有內置的操作符判斷對象的內容是否相同。
可以使用lodash的isEqual方法,如下圖: