第三章 原生函數
JS有很多原生函數,為基本的數據類型值提供了封裝對象,String,Number,Boolean等。我們可以通過{}.call.toString()來查看所有typeof返回object的對象的內置屬性[[class]],這個屬性無法直接訪問。我們基本類型調用的方法和屬性都是通過封裝對象去訪問的,例如var a = “abc”; a.length//3,但是有一點需要注意的是new Boolean(false)//true,為false封裝對象時,它是一個真值(即總是返回true),平時在用到封裝對象中的基本類型值的時候,JS會發生隱式拆封。
第四章 強制類型轉換
強制類型轉換是JS里難以掌握的,但是在實際應用中它又是很有用處的,我們十分有必要去深入理解和合理運用它。類型轉換有顯式和隱式之分,后者就是強制類型轉換,例如var a = 42; var b = a + “”;//“42”,這里數字a被轉換為了字符串b。
非字符串轉換為字符串,在沒有自行定義的情況下,普通對象調用toString方法返回內部的[[Class]]值,JSON.Stringfy函數在將對象序列化為字符串時,如果定義了toJSON方法就會首先調用該方法,用返回值進行序列化,在數組中如果遇到undefined,空function,那么會在對應位置返回null以保證單元位置不變。
在將非數字值轉換為數字時就會進行ToNumber操作,false轉換為0,true轉換為1,undefined轉換為NaN,null轉換為0,對于對象來說,會首先調用valueOf,沒有就調用toString來返回基本類型,然后再強制轉換為數字值,如果均不返回數字,則會報錯。 轉換為布爾值時,從邏輯上說,出現在假值列表上的才為假值,+0,-0,infinite,null,undefined,””,NaN等,要特別注意的是這些假值封裝的對象是真值(所有對象都是真值),除了””以外的字符串也都是真值。
~這個符號能有奇妙的功能,~X可以視為-(X+1)。通常用+X來把X轉換為數字,用X+””來將X轉換為字符串,用X|0來將X取整。
對于+運算符,先是調用toString進行字符串拼接,如果不行就用valueOf轉換為數字,進行加法操作。
對于比較運算,數字和字符串比較先轉化為數字,如果有布爾類型就將布爾類型轉換為數字,字符串或數字和對象比較,先把對象用toString,valueOf轉換為字符串或者數字。