iT邦幫忙

1

javascript 菜機問題

最近在寫網頁的js
發現了一個問題
為甚麼 {} != {} 會是true
不知道有沒有大大可以幫小弟解惑

看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 8 級 ‧ 2019-11-07 08:20:49 檢舉
https://stackoverflow.com/questions/11704971/why-are-two-identical-objects-not-equal-to-each-other
豬豬人 iT邦新手 5 級 ‧ 2019-11-07 08:34:48 檢舉
是傳"值" 跟傳"址" 的關係吧
a5502008 iT邦新手 5 級 ‧ 2019-11-07 08:37:31 檢舉
所以就是在js下 物件==物件 永遠會是 false的意思?
應該是這樣理解吧?
小魚 iT邦大師 1 級 ‧ 2019-11-07 08:44:33 檢舉
JavaScript是個神奇的東西,
不過實務上會用到這個嗎?
a5502008 iT邦新手 5 級 ‧ 2019-11-07 08:47:37 檢舉
小弟不才 剛好遇到這問題
2
dragonH
iT邦超人 5 級 ‧ 2019-11-07 08:49:00
最佳解答

object 本來就不能這樣比

array 也是一樣

object 的話

你可以去檢查他的 key: value 是否相同

然後盡量用 !== 來比較

!== 會去比兩者的 type 跟 value 是否相同

e.g.

0 == '0'; // true
0 === '0' // false

同理 ===

看更多先前的回應...收起先前的回應...

引用 Kuro大大的名言:

來看看各種莫名其妙的比較判斷:

false == 0    // true
true == 1     // true

[] == []      // false
[] == ![]     // true

[] == ''      // true
[] == 0       // true

[''] == ''    // true
[0] == 0      // true

[0] == ''     // false
[''] == 0     // true

null == undefined   // true

[null] == ''        // true
[null] == 0         // true

[undefined] == ''   // true
[undefined] == 0    // true


看完還覺得 JavaScript 如此貼心嗎? 是噁心吧
「JavaScript 我真是猜不透你啊~」

哈哈哈哈哈哈哈哈 (壞掉惹

froce iT邦大師 1 級 ‧ 2019-11-07 09:22:02 檢舉

提供個只檢查object value是否相同的方法好了。

Object.prototype.equals = function(o1, o2){
    function _isObject(item){
        return (typeof item === "object" && !Array.isArray(item) && item !== null)
    }

    if (_isObject(o1) && _isObject(o2)) {
        let e1 = Object.entries(o1).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
        let e2 = Object.entries(o2).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))

        return e1.toString() === e2.toString()
    }

    return false
}

Object.equals({a:1, b:2}, {b:2, a:1})  // true
dragonH iT邦超人 5 級 ‧ 2019-11-07 09:29:53 檢舉

/images/emoticon/emoticon32.gif

froce iT邦大師 1 級 ‧ 2019-11-07 09:45:11 檢舉

我JS寫到現在我也放棄理解了,反正遇到覺得一定會踩坑的地方就先查一下。XD

dragonH iT邦超人 5 級 ‧ 2019-11-07 09:59:10 檢舉

JS 真的是很多坑

每次看到佛祖回的 js

都懷疑是不是跟我寫的是同一種東西XD /images/emoticon/emoticon07.gif

fillano iT邦超人 1 級 ‧ 2019-11-07 09:59:38 檢舉

兩個object literal產生兩個不同的object,這結果應該很合理才對XD

froce iT邦大師 1 級 ‧ 2019-11-07 10:03:02 檢舉

兩個object literal產生兩個不同的object,這結果應該很合理才對XD

其實這個跟python是一樣的,所以這種變數我不會踩坑。XD
我會踩到坑的是this...Orz

1
阿展展展
iT邦好手 1 級 ‧ 2019-11-07 08:32:09

這個問題太困難了
而且這不是特例

重新認識 JavaScript: Day 03 變數與資料型別

這篇先讀完,我們再繼續看下去....

a5502008 iT邦新手 5 級 ‧ 2019-11-07 08:43:35 檢舉

看完頭好痛....

恭喜你!!! 你踏出了第一步!!!
歡迎踏入 快樂? 的JavaScript程式設計領域
https://ithelp.ithome.com.tw/upload/images/20191107/20119546cN09iwGj21.jpg

a5502008 iT邦新手 5 級 ‧ 2019-11-07 08:51:18 檢舉

/images/emoticon/emoticon06.gif

0
浩瀚星空
iT邦超人 1 級 ‧ 2019-11-07 12:33:59

簡單明白的說明。一個是null。一個是obj
所以null!=obj。當然為真了。

至於為何它會是null
因為變數定義,未定義前永遠為null。
但後面是屬於給定值。所以為obj。

以上簡單的說明是否能明白。

看更多先前的回應...收起先前的回應...
dragonH iT邦超人 5 級 ‧ 2019-11-07 14:30:03 檢舉

簡單明白的說明。一個是null。一個是obj
所以null!=obj。當然為真了。
至於為何它會是null
因為變數定義,未定義前永遠為null。
但後面是屬於給定值。所以為obj。

let a = {};
let b = {};
console.log(a != b); // true

可是這樣也是一樣耶 /images/emoticon/emoticon06.gif

froce iT邦大師 1 級 ‧ 2019-11-07 14:59:46 檢舉

這是我的理解,有可能有錯,因為我啃不下「你不知道的javascript」:
還是用這篇回答
https://ithelp.ithome.com.tw/questions/10193813

mutable type在儲存中就是記憶體位址,你分配出去的兩個位址不可能相同,除非你指派另一個別名。
{} == {}就是產生了兩個object去比較,比較的對象是所分配的記憶體位址,當然就是false。

佛祖的教誨:兩個object literal產生兩個不同的object,這結果應該很合理才對XD

應該就是在說我這回答。超精湛的。XD

然後「你不知道的javascript」如果讀到通真的會對瞭解JS幫助很大。只是我真的讀不通...Orz

dragonH iT邦超人 5 級 ‧ 2019-11-07 15:16:27 檢舉

mutable type在儲存中就是記憶體位址,你分配出去的兩個位址不可能相同,除非你指派另一個別名。

參考支援1

參考支援2

看起來就是這樣了XD

然後「你不知道的javascript」如果讀到通真的會對瞭解JS幫助很大

推坑大成功

我都想買來看了

不過好像分成 上中下 /images/emoticon/emoticon21.gif

突然發現作者有出免費電子書

You-Dont-Know-JS

其實我只是用行為來解釋。不是用學術來解式。

在javascript來說。一但發生無法推斷的類型。就會用它的意思去做解釋。
說用定址的方式也對。但我比較喜歡用null=obj的說法。

要真的說比較複雜的說法。就是空值的定義在javascript區分太多定義了。
而左邊的定義空值與右邊的定差空值各自不一樣。
就會發生這樣的事。

a5502008 iT邦新手 5 級 ‧ 2019-11-08 08:10:55 檢舉

js 真的很玄...

st880221 iT邦新手 5 級 ‧ 2019-11-08 14:48:17 檢舉

觀念錯誤,
首先,這就是一個典型考Memory ref比對的問題,樓主的進入點就錯了。
再來,未宣告未定義,既不是undefined更不是null,這點很重要,null是特別去assign才會有的一個特殊值

這是一種小說式的講解。學術上的說法確實是定址定值的方式不同。導致類型解釋的不同。
用比較單純的說法。一但有值的情況下。就不會發生這樣的事。其原因也很單純就是定值的問題。

真正要說的話,這並不是單純的Memory ref。
可是要解釋起來會有太多學術上的說明。一般初學者來說。在對於電子位能式及位數進位補位的相關理念不同。解釋出來會更麻煩。

我不會說我說的對,我只是用小說式的說法。來讓初學者明白一點。
認真來說,想要真心研究的人,自然就明白我說的不完全對。
但對初學者而言,只要懂這樣就行了。解釋太複雜反而會更不明白。

我要發表回答

立即登入回答