javascript中資料類型轉換那些事

來源:互聯網
上載者:User

在js中,總的來說資料類型分為兩大類,一類是原始實值型別的,一類是參考型別的。原始實值型別的包括:字串(String)數字(Number)布爾值(Boolean) 以及兩個特殊的值 nullundefined 。參考型別的主要是指對象,在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、字串轉換成布爾值

這個更簡單,除了Null 字元串被轉換成false外,所有字串都會被轉換成true

3、其他類型轉換成布爾值

undefined和null會被轉換成false, 任何對象(包括數組)和函數都會被轉換成true,記住,是任何

var o = new Boolean(false);alert(o);//轉換成字串,結果是falsealert(!!o); //轉換成布爾值,結果是 true

 

二、轉換成字串

把某一個東西強制轉換成字串有兩種方法:

'' + x //方法一,用一個Null 字元串與之相加String(x) //方法二,使用不帶new的字串建構函式

1、數字轉換成字串

這個沒什麼要說的,數字都是按原樣轉換成字串,但用科學計數法表示的數字(也就是帶e的)會轉換成它內部代表的真實的數位字串。

還需要注意的是,當使用二元的加號運算子時,如果兩個運算數中有一個不是數字,則會進行字串的串連操作,而不是數學加法操作,兩個運算數都會被轉換成字串。當null與數字相加時,不會進行字串串連,而是會把null轉換成0來進行數學元素。

[]+1+3  //結果為13[1]+3   //結果為13null+1+3  //結果為4 

2、其他類型轉換成字串

當對象或函數轉換成字串時,會調用它們的 toString() 方法來進行轉換,預設的是 Object.prototype.toString 和 Function.prototype.toString,但它們是可以被我們自訂的toString方法覆蓋的。當把一個函數轉換成一個字串時,不一定就要顯示函數的原始碼,Function.prototype.toString 方法的結果依賴於它的環境是怎麼實現它的。

 

三、轉換成數字

除了加號以外的其他數學運算子,都會進行轉換為數位操作。把一個東西強制轉換成數字也有兩種方法:

+x //使用一個一元的加號運算子,這是最快的方法x-0 或 x*1 //另一種形式Number(x)  //使用不帶new的數字建構函式進行轉換

1、字串轉換成數字

除了Null 字元串會被轉換成0以外,如果字串中是正確的數字書寫形式,那麼都可以順利轉換成相應的數字,不管是小數、科學計數還是八進位、十六進位形式等。但是如果參雜了其他不能構成數字或不符合數字書寫規則的東西,則會被轉換成NaN。

NaN是指不是數位意思,任何數字數字跟NaN進行運算得到的結果都是NaN,NaN甚至跟自己也不相等。

2、其它類型轉換成數字

對象和函數總是被轉換成NaN, undefined也會被轉換成NaN, 但null會被轉換成0

上面的表遺漏了數組的情況。數組會首先被轉換成字串,然後再轉換成數字。

alert(+[]);  //結果為0alert(+[1]); //結果為1alert(+[1,2]); //結果為NaNalert(+new Array(1)); //結果為0 alert(+new Array(1,2)); //結果為NaN 

3、兩個數字轉換函式

parseInt

parseFloat

資料類型轉換看起來很簡單,但有些東西卻很容易弄混淆,要想真正掌握它,也還是要花費一些功夫的。

參考資料:http://jibbering.com/faq/notes/type-conversion/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.