在js中,總的來講數據類型分爲兩大類,一類是原始值類型的,一類是引用類型的。原始值類型的包括:字符串(String) 、數字(Number) 、布爾值(Boolean) 以及兩個特殊的值 null 和 undefined 。引用類型的主要是指對象,在js中,對象的範圍很廣,甚至有js中一切都是對象這樣的說法。對象能夠分爲 對象(Object) 以及更具體的數組(Array) 、 函數(Function) 等類型。要注意的是,js中typeof運算符返回的類型只有:sting、number、boolean、object、function、undefined幾種,typeof null 返回的是 object,但通常認爲null是不屬於對象的。 數組
關於js中是否是一切都是對象這句話,實際上是有爭議的。例如,咱們能夠直接在經過單引號或雙引號定義的字符串字面量上調用方法: 函數
'this is a string'.charAt(0);這條語句是可以執行並獲得正確結果的。字符串的確是個對象,可是問題在於沒有經過構造函數而是直接使用字面量的字符串又算不算對象呢?這還要說嗎,這個語句不就是在字符串字面量上調用的方法嘛,能調用方法的固然是對象了。是的,咱們看到的的確是這樣,但事實又是如何呢?
事實就是,經過字面量定義的字符串並非對象,或者最多隻能說它是個僞對象,由於當在字符串字面量上調用方法或屬性時,程序會在背後默默的建立一個 與這個字面量的值相等的臨時字符串對象,而後再在這個臨時對象上調用屬性或方法,最後把結果返回去,這個臨時字符串對象完成使命後也隨之會被銷燬。 this
還有一個有力的證據就是,你能夠在字符串字面量上添加一個屬性,或者是改變一個屬性值,但結果是沒法成功的: spa
vars ='this is a string'; s.bar ='hello';//給這個字符串添加一個屬性 alert(s.bar);//結果獲得的是 undefined,不是 'hello'獲得undefined的緣由是,s.bar 這個屬性是加在了程序偷偷建立的那個臨時字符串對象上,但咱們沒法獲得這個臨時字符創對象的引用,並且這個臨時字符串對象很快就被銷燬了。因此給字符串字面量添加屬性或改變屬性值是沒有任何意義的,由於它根本不會受到影響。
數字字面量以及布爾值字面量也是相似的原理,這裏就再也不贅述了。 prototype
下面進入正題了---js中各類數據類型間的相互轉換。 code
1、轉換成布爾值 對象
程序在 if 語句 以及 ||、&&、! 等邏輯判斷的環境下會把表達式自動轉換成布爾值。
想要手動轉換某個東西爲布爾值有兩種方法:一、使用 !! ; 二、使用 Boolean(),記住前面不要加new; blog
一、數字轉換成布爾值 字符串
除了0被轉換成false外,全部自他數字都會被轉換成true, NaN 也老是被轉換成false get
二、字符串轉換成布爾值
這個更簡單,除了空字符串被轉換成false外,全部字符串都會被轉換成true
三、其餘類型轉換成布爾值
undefined和null會被轉換成false, 任何對象(包括數組)和函數都會被轉換成true,記住,是任何
varo =newBoolean(false); alert(o);//轉換成字符串,結果是false alert(!!o);//轉換成布爾值,結果是 true
2、轉換成字符串
把某一個東西強制轉換成字符串有兩種方法:
''+ x//方法一,用一個空字符串與之相加 String(x)//方法二,使用不帶new的字符串構造函數一、數字轉換成字符串
這個沒什麼要說的,數字都是按原樣轉換成字符串,但用科學計數法表示的數字(也就是帶e的)會轉換成它內部表明的真實的數字的字符串。
還須要注意的是,當使用二元的加號運算符時,若是兩個運算數中有一個不是數字,則會進行字符串的鏈接操做,而不是數學加法操做,兩個運算數都會被轉換成字符串。當null與數字相加時,不會進行字符串鏈接,而是會把null轉換成0來進行數學元素。
[]+1+3 //結果爲13 [1]+3 //結果爲13 null+1+3 //結果爲4二、其餘類型轉換成字符串
當對象或函數轉換成字符串時,會調用它們的 toString() 方法來進行轉換,默認的是 Object.prototype.toString 和 Function.prototype.toString,但它們是能夠被咱們自定義的toString方法覆蓋的。當把一個函數轉換成一個字符串時,不 必定就要顯示函數的源代碼,Function.prototype.toString 方法的結果依賴於它的環境是怎麼實現它的。
3、轉換成數字
除了加號之外的其餘數學運算符,都會進行轉換爲數字的操做。把一個東西強制轉換成數字也有兩種方法:
+x//使用一個一元的加號運算符,這是最快的方法 x-0 或 x*1//另外一種形式 Number(x) //使用不帶new的數字構造函數進行轉換一、字符串轉換成數字
除了空字符串會被轉換成0之外,若是字符串中是正確的數字書寫形式,那麼均可以順利轉換成相應的數字,不論是小數、科學計數仍是八進制、十六進制形式等。可是若是參雜了其餘不能構成數字或不符合數字書寫規則的東西,則會被轉換成NaN。
NaN是指不是數字的意思,任何數字數字跟NaN進行運算獲得的結果都是NaN,NaN甚至跟本身也不相等。
二、其它類型轉換成數字
對象和函數老是被轉換成NaN, undefined也會被轉換成NaN, 但null會被轉換成0
上面的表遺漏了數組的狀況。數組會首先被轉換成字符串,而後再轉換成數字。
alert(+[]); //結果爲0 alert(+[1]);//結果爲1 alert(+[1,2]);//結果爲NaN alert(+newArray(1));//結果爲0 alert(+newArray(1,2));//結果爲NaN三、兩個數字轉換函數
parseInt
parseFloat
數據類型轉換看起來很簡單,但有些東西卻很容易弄混淆,要想真正掌握它,也仍是要花費一些功夫的。