最近在讀《你不知道的javascript》系列圖書,收獲蠻大,感慨也挺多的。
是的,關于javascript,你不是不知道,而是真的不知道。
就比如類型轉換,從開始到看完到第二第三第N遍,我經曆了如下的心路曆程:
這有什麼不知道的 → 一臉懵逼 → 有點意思 → 卧槽,怎麼這樣? → 原來是這樣 → 靠,還是坑...
真可謂是不學不知道,一學吓一跳。
為了避免再次入坑,這裡做個總結,不,了結。
Javascript中的強制類型轉換總是傳回标量基本類型值(<code>string, boolean, number, undefined, null</code>)。 直白點就是<code>toString()</code>或者<code>valueOf()</code>的傳回值。
toString : 以字元串形式傳回該對象的原始值
valueOf : 傳回最适合該對象類型的原始值
在數值運算中,會優先調用valueOf
在字元串運算中,會優先調用toString
對象在強制轉換為字元串的時候,會優先調用toString()方法,如果傳回基本類型的值,則直接使用該傳回值; 如果傳回值不是基本類型,則會繼續調用valueOf()方法,如果valueOf()傳回基本類型的值,則直接使用該傳回值,否則報錯。 數組預設的toString方法經過了重新定義,類似于數組的<code>join(',')</code>方法,會将數組的各個元素以<code>,</code>分隔傳回。這就是<code>String([]) === ''</code> 的原因。
值
轉換後
null
'null'
undefined
'undefined'
true
'true'
false
'false'
'0'
-0
NaN
'NaN'
1
'1'
{}
'[object Object]'
[]
''
[1, 2]
'1,2'
function (){}
'function (){}'
<code>JSON.stringify</code>在<code>對象</code>中遇到<code>undefined、function、symbol</code>時會自動忽略
<code>JSON.stringify</code>在<code>數組</code>中遇到<code>undefined、function、symbol</code>時會傳回<code>null</code>
字元串、數字、布爾、null的<code>JSON.stringify</code>的規則與ToString相同
如果傳遞給JSON.stringify的對象中定義了<code>toJSON()</code>方法,那麼該方法會在字元串化前調用。
對象在強制轉換為數字的時候,會優先調用valueOf()方法,如果傳回基本類型的值,則直接使用該傳回值; 如果傳回值不是基本類型,則會繼續調用toString()方法,如果toString()傳回基本類型的值,則直接使用該傳回值,否則報錯。
Number([]),因為[].valueOf()傳回值不是基本類型,是以會調用toString(), 等價于Number('')
javascript有以下假值:
+0、-0 和 NaN
假值的布爾強制類型轉化為<code>false</code>
可以了解為假值清單以外的都是真值(<code>true</code>)
== 允許在相等比較中進行強制類型轉換,=== 不允許 == 和 === 都會檢查操作數的類型,差別在于操作數類型不同時他們的處理方式不同,即== 會進行強制類型轉換
如果兩邊的值中有true或者false,千萬不要使用 ==
如果兩邊的值中有[]、''或者0, 盡量不要使用 ==
<code>+</code>運算符 (即隻有一個操作數) 用來強制轉化為數字 <code>+ new Date()</code>
&& 和 || 運算符的傳回值并不一定是布爾類型,而是兩個操作數其中一個的值
<a href="https://item.jd.com/12030814.html" target="_blank">《你不知道的JavaScript(中)》</a>