天天看點

JAVASCRIPT學習筆記之強制類型轉換

最近在讀《你不知道的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>

&amp;&amp; 和 || 運算符的傳回值并不一定是布爾類型,而是兩個操作數其中一個的值

<a href="https://item.jd.com/12030814.html" target="_blank">《你不知道的JavaScript(中)》</a>

繼續閱讀