在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);
這條語句是能夠執行並得到正確結果的。字符串的確是個對象,但是問題在於沒有通過構造函數而是直接使用字面量的字符串又算不算對象呢?這還要說嗎,這個語句不就是在字符串字面量上調用的方法嘛,能調用方法的當然是對象了。是的,我們看到的的確是這樣,但事實又是如何呢?
事實就是,通過字面量定義的字符串並不是對象,或者最多只能說它是個偽對象,因為當在字符串字面量上調用方法或屬性時,程序會在背后默默的創建一個與這個字面量的值相等的臨時字符串對象,然后再在這個臨時對象上調用屬性或方法,最后把結果返回去,這個臨時字符串對象完成使命后也隨之會被銷毀。
還有一個有力的證據就是,你可以在字符串字面量上添加一個屬性,或者是改變一個屬性值,但結果是無法成功的:
var s = 'this is a string'; s.bar = 'hello'; //給這個字符串添加一個屬性 alert(s.bar); //結果得到的是 undefined,不是 'hello'
得到undefined的原因是,s.bar 這個屬性是加在了程序偷偷創建的那個臨時字符串對象上,但我們無法得到這個臨時字符創對象的引用,而且這個臨時字符串對象很快就被銷毀了。所以給字符串字面量添加屬性或改變屬性值是沒有任何意義的,因為它根本不會受到影響。
數字字面量以及布爾值字面量也是類似的原理,這里就不再贅述了。
下面進入正題了---js中各種數據類型間的相互轉換。
一、轉換成布爾值
程序在 if 語句 以及 ||、&&、! 等邏輯判斷的環境下會把表達式自動轉換成布爾值。
想要手動轉換某個東西為布爾值有兩種方法:1、使用 !! ; 2、使用 Boolean(),記住前面不要加new;
1、數字轉換成布爾值
除了0被轉換成false外,所有自他數字都會被轉換成true, NaN 也總是被轉換成false
2、字符串轉換成布爾值
這個更簡單,除了空字符串被轉換成false外,所有字符串都會被轉換成true
3、其他類型轉換成布爾值
undefined和null會被轉換成false, 任何對象(包括數組)和函數都會被轉換成true,記住,是任何
var o = new Boolean(false); alert(o);//轉換成字符串,結果是false alert(!!o); //轉換成布爾值,結果是 true
二、轉換成字符串
把某一個東西強制轉換成字符串有兩種方法:
'' + x //方法一,用一個空字符串與之相加 String(x) //方法二,使用不帶new的字符串構造函數
1、數字轉換成字符串
這個沒什么要說的,數字都是按原樣轉換成字符串,但用科學計數法表示的數字(也就是帶e的)會轉換成它內部代表的真實的數字的字符串。
還需要注意的是,當使用二元的加號運算符時,如果兩個運算數中有一個不是數字,則會進行字符串的連接操作,而不是數學加法操作,兩個運算數都會被轉換成字符串。當null與數字相加時,不會進行字符串連接,而是會把null轉換成0來進行數學元素。
[]+1+3 //結果為13 [1]+3 //結果為13 null+1+3 //結果為4
2、其他類型轉換成字符串
當對象或函數轉換成字符串時,會調用它們的 toString() 方法來進行轉換,默認的是 Object.prototype.toString 和 Function.prototype.toString,但它們是可以被我們自定義的toString方法覆蓋的。當把一個函數轉換成一個字符串時,不一定就要顯示函數的源代碼,Function.prototype.toString 方法的結果依賴於它的環境是怎么實現它的。
三、轉換成數字
除了加號以外的其他數學運算符,都會進行轉換為數字的操作。把一個東西強制轉換成數字也有兩種方法:
+x //使用一個一元的加號運算符,這是最快的方法 x-0 或 x*1 //另一種形式 Number(x) //使用不帶new的數字構造函數進行轉換
1、字符串轉換成數字
除了空字符串會被轉換成0以外,如果字符串中是正確的數字書寫形式,那么都可以順利轉換成相應的數字,不管是小數、科學計數還是八進制、十六進制形式等。但是如果參雜了其他不能構成數字或不符合數字書寫規則的東西,則會被轉換成NaN。
NaN是指不是數字的意思,任何數字數字跟NaN進行運算得到的結果都是NaN,NaN甚至跟自己也不相等。
2、其它類型轉換成數字
對象和函數總是被轉換成NaN, undefined也會被轉換成NaN, 但null會被轉換成0
上面的表遺漏了數組的情況。數組會首先被轉換成字符串,然后再轉換成數字。
alert(+[]); //結果為0 alert(+[1]); //結果為1 alert(+[1,2]); //結果為NaN alert(+new Array(1)); //結果為0 alert(+new Array(1,2)); //結果為NaN
3、兩個數字轉換函數
parseInt
parseFloat
數據類型轉換看起來很簡單,但有些東西卻很容易弄混淆,要想真正掌握它,也還是要花費一些功夫的。