本文中的簡單基本類型指的是除了 object 的基本類型
對于這個問題狼犯,首先我們需要知道余寥,在 JavaScript 中對兩個操作數(shù)進(jìn)行加法操作會發(fā)生什么。
總的來說有以下幾種情況:
- 當(dāng)加號兩邊都是非字符串以及非對象的操作數(shù)時悯森,進(jìn)行數(shù)字相加宋舷。比如 true + null === 1。
- 當(dāng)加號兩邊有一方或兩方都是字符串時瓢姻,執(zhí)行字符串的連接祝蝠。比如 1 + "2" === "12"。
- 當(dāng)加號兩邊有一方或兩方為對象時,先對對象進(jìn)行拆箱操作绎狭,然后用拆箱后得到的簡單基本類型作為操作數(shù)细溅。
標(biāo)題中的表達(dá)式其實是對于第三條規(guī)則的應(yīng)用,當(dāng)執(zhí)行代碼 4 + [1] 時坟岔,會先對 [1] 進(jìn)行拆箱操作谒兄。這個拆箱操作就是調(diào)用 [1] 的隱藏函數(shù) [[ToPrimitive]] ,然后得到簡單基本類型社付。
數(shù)組的 ToPrimitive 函數(shù)執(zhí)行時會先調(diào)用對象的 valueOf 方法承疲,如果沒有得到簡單基本類型再調(diào)用對象的 toString 方法。
我們可以直接使用 [1].valueOf() 和 [1].toString() 查看結(jié)果鸥咖。最終我們發(fā)現(xiàn) valueOf 的結(jié)果是一個數(shù)組燕鸽,toString 的結(jié)果是一個字符串 "1"。所以 [1] 拆箱的最終結(jié)果是 "1"啼辣。
標(biāo)題中的 4 + [1] 相當(dāng)于 4 + "1" 啊研,結(jié)果為 "41"。
其實在這個問題中鸥拧,我們還可以知道為什么沒有元素或有一個元素的數(shù)組可以轉(zhuǎn)換為數(shù)字党远。
- Number([]) : 空數(shù)組拆箱后得到空字符串,空字符串可以轉(zhuǎn)換為數(shù)字 0富弦。
- Number([1]): 數(shù)組拆箱后得到字符串 "1"沟娱,這個字符串轉(zhuǎn)換為數(shù)字為 1。
- Number([1,2]): 數(shù)組拆箱后得到字符串 "1,2" 腕柜,Number("1,2") 結(jié)果為 NaN济似。
Number 用來執(zhí)行類型轉(zhuǎn)換,也可以用 +"string" 的方法來執(zhí)行轉(zhuǎn)換盏缤。