javascript基本數(shù)據(jù)類(lèi)型和轉(zhuǎn)換
ECMAScript中有5種基本數(shù)據(jù)類(lèi)型:Undefined、Null、Boolean、Number、String。還有1種復(fù)雜數(shù)據(jù)類(lèi)型—Object,Object實(shí)質(zhì)上是由一組無(wú)序的名值對(duì)(鍵值對(duì))組成的。ECMAScript不支持任何創(chuàng)建自定義類(lèi)型的機(jī)制。
由于ECMAScript是松散型的,所以需要一種手段來(lái)檢測(cè)變量的數(shù)據(jù)類(lèi)型,typeof就是具有這種功能的操作符。用typeof檢測(cè)變量可能返回以下某個(gè)字符串:
"undefined" | 變量未定義 |
"boolean" | 變量是布爾值 |
"string" | 變量是字符串 |
"number" | 變量是數(shù)值 |
"object" | 變量是對(duì)象或者null |
"function" | 變量是函數(shù) |
從技術(shù)的角度講,函數(shù)在ECMAScript中是對(duì)象,不是一種數(shù)據(jù)類(lèi)型。然而,函數(shù)有一些特殊的屬性,因此通過(guò)typeof來(lái)區(qū)分函數(shù)和其它對(duì)象是有必要的。
Undefined類(lèi)型只有一個(gè)值,就是特殊的undefined。在使用var聲明變量但未初始化時(shí),這個(gè)變量的值就是undefined,如:
var a; alert(a == undefined); //true
不過(guò),包含undefined值的變量和尚未定義的變量不一樣,如:
var a; // 這個(gè)變量聲明之后默認(rèn)取得了undefined值 // 下面這個(gè)變量并沒(méi)有聲明 // var b alert(a); // "undefined" alert(b); // 產(chǎn)生錯(cuò)誤
然而對(duì)未聲明或者聲明沒(méi)有初始化的變量使用typeof都會(huì)返回undefined,如:
var a; // var b; alert(typeof a); // "undefined" alert(typeof b); // "undefined"
Null類(lèi)型也只有一個(gè)值,就是null。從邏輯的角度來(lái)看,null值表示一個(gè)空指針,所以用typeof檢測(cè)null值會(huì)返回"object",如:
var car = null; alert(typeof car); // "object"
所以如果要定義變量來(lái)存放對(duì)象,最好將該變量初始化為null。實(shí)際上,undefined值是繼承自null值的,所以判斷它們的相等性會(huì)返回true:
alert(null == undefined); // true
盡管null和undefined有這樣的關(guān)系,但它們用途是完全不同的,因?yàn)闊o(wú)論什么時(shí)候都沒(méi)有必要把一個(gè)變量的值顯示的設(shè)置為undefined,然而當(dāng)定義一個(gè)還未保存對(duì)象的對(duì)象變量時(shí),就應(yīng)該將變量設(shè)置為null,這樣不僅可以體現(xiàn)null作為空對(duì)象的指針,還有能很好地區(qū)分null和undefined。
Boolean類(lèi)型有兩個(gè)字面值:true和false,但是ECMAScript中所有類(lèi)型的值都能調(diào)用Boolean()函數(shù)轉(zhuǎn)換成Boolean類(lèi)型的值,下表列出了各種數(shù)據(jù)類(lèi)型對(duì)應(yīng)的轉(zhuǎn)換規(guī)則:
數(shù)據(jù)類(lèi)型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
Boolean | true | false |
String | 任何非空字符串 | ""空字符串 |
Number | 任何非零數(shù)字值 | 0和NaN |
Object | 任何對(duì)象 | null |
Undefined | / | undefined |
Number類(lèi)型分為整數(shù)和浮點(diǎn)數(shù),整數(shù)可以用十進(jìn)制,八進(jìn)制或十六進(jìn)制表示,如:
var num1 = 22; //十進(jìn)制整數(shù) var num2 = 070; //八進(jìn)制的56 var num3 = 079; // 無(wú)效的八進(jìn)制,解析為十進(jìn)制79 var num4 = 08; //無(wú)效的八進(jìn)制,解析為十進(jìn)制8 var num5 = 0xA; //十六進(jìn)制的10 var num6 = 0x1f; //十六進(jìn)制的31
但是八進(jìn)制字面量在嚴(yán)格模式下是無(wú)效的,在進(jìn)行算數(shù)計(jì)算時(shí),所有的數(shù)值最終都會(huì)轉(zhuǎn)換為十進(jìn)制數(shù)值。浮點(diǎn)數(shù)值必須包含一個(gè)小數(shù)點(diǎn),如:
var floatNum1 = 1.1; var floatNum2 = .1; //有效,但不推薦 var floatNum3 = 1.; //小數(shù)點(diǎn)后面沒(méi)有數(shù)字,解析為1 var floatNum4 = 10.0; //整數(shù),解析為10
浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但在進(jìn)行算數(shù)計(jì)算時(shí)精確度遠(yuǎn)不如整數(shù),例如:
var a = 0.1; var b = 0.2; var c = a + b; //c的值為0.30000000000000004
NaN,即非數(shù)值,是一個(gè)特殊的Number值,NaN有兩個(gè)特點(diǎn):任何和NaN操作的結(jié)果都會(huì)返回NaN,NaN與任何值都不相等,包括NaN。使用isNaN()函數(shù)可以判斷一個(gè)值是不是NaN,isNaN()在接收到一個(gè)參數(shù)時(shí),會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值,任何不能轉(zhuǎn)換為數(shù)值的值都會(huì)返回true,如:
alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10是一個(gè)數(shù)值) alert(isNaN("10")); //false(可以被轉(zhuǎn)換為數(shù)值10) alert(isNaN("abc")); //true(不能轉(zhuǎn)換為數(shù)值) alert(isNaN(true)); //false(可以轉(zhuǎn)換為數(shù)值1) var obj = {name:"zhangsan", age:"1"}; alert(isNaN(obj)); //true
isNaN()也能轉(zhuǎn)換對(duì)象,對(duì)象調(diào)用isNaN()時(shí),會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法的返回值是否可以轉(zhuǎn)換為數(shù)值,如果不能,則用這個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值。
非數(shù)值轉(zhuǎn)換成數(shù)值的方法有三個(gè):Number()、parseInt()、parseFloat()。Number()可以轉(zhuǎn)換任何數(shù)據(jù)類(lèi)型的值,而parseInt()和parseFloat()只能轉(zhuǎn)換字符串。
Number()函數(shù)有以下轉(zhuǎn)換規(guī)則:
1.如果是Boolean值,true轉(zhuǎn)換為1,false轉(zhuǎn)換為0;
var num = Number(true); //1 var num2 = Number(false); //0
2.如果是Number值,就和傳入的值一樣;
var num = Number(1); //1
3.如果是null,轉(zhuǎn)換為0;
var num = Number(null); //0
4.如果是undefined,轉(zhuǎn)換為NaN;
var num = Number(undefined); //NaN
5.如果是String值,要分多種情況,如果是空字符串,則轉(zhuǎn)換為0;如果是純數(shù)字的字符串,則將其轉(zhuǎn)換為相對(duì)應(yīng)的數(shù)值,如果字符串是數(shù)字且包含".",則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(如果字符串最前面是0,會(huì)被忽略),如果字符串是有效的十六進(jìn)制格式,會(huì)將其轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制數(shù)值;如果字符串包含上述格式之外的字符,則轉(zhuǎn)換為NaN;如果字符串是對(duì)象,會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法的返回值是否可以轉(zhuǎn)換為數(shù)值,如果結(jié)果是NaN,則調(diào)用toString()方法,再測(cè)試返回值。
var num = Number("Hello World"); //NaN var num2 = Number(""); //0 var num3 = Number("01"); //1 var num4 = Number("01.1"); //1.1 var obj = {name:"zhangsan", age:"1"}; alert(Number(obj)); //NaN
由于Number()在轉(zhuǎn)換字符串是比較復(fù)雜,所以轉(zhuǎn)換字符串常用parseInt()和parseFloat()。這兩個(gè)函數(shù)在轉(zhuǎn)換字符串時(shí),會(huì)檢測(cè)該字符串是否符合數(shù)值模式,從第一個(gè)非空格字符開(kāi)始解析,如果第一個(gè)字符不是數(shù)值或者負(fù)號(hào),則返回NaN(包括空字符串)。如果第一個(gè)字符是字符串,則繼續(xù)解析后面的字符,直到解析完所有的字符或者遇到非數(shù)字字符。
parseInt()能夠識(shí)別各種整數(shù)格式(十進(jìn)制、八進(jìn)制、十六進(jìn)制),如果字符串以"0x"開(kāi)頭且后跟數(shù)字字符,就會(huì)被解析為十六進(jìn)制,如果以"0"開(kāi)頭且后跟數(shù)字字符,則會(huì)被解析為八進(jìn)制(ECMAScript5不識(shí)別八進(jìn)制,會(huì)將前面的0忽略,解析為十進(jìn)制)。
var num = parseInt("123Hello"); //123 var num2 = parseInt(""); //NaN var num3 = parseInt("0xA"); //10(十六進(jìn)制) var num4 = parseInt("22.3"); //22 var num5 = parseInt("070"); //56(ECMAScript3八進(jìn)制) 70(ECMAScript5十進(jìn)制) var num6 = parseInt("23"); //23(十進(jìn)制)
為了解決兼容性問(wèn)題,parseInt()提供第二個(gè)參數(shù),以何種數(shù)值格式解析。
var num1 = parseInt("0xAF", 16); //175 var num2 = parseInt("AF", 16); //175,可以省略前面的"0x" var num3 = parseInt("10", 2); //2(二進(jìn)制) var num3 = parseInt("10", 8); //8(八進(jìn)制) var num3 = parseInt("10", 10); //10(十進(jìn)制) var num3 = parseInt("10", 16); //16(十六進(jìn)制)
parseFloat()只識(shí)別第一個(gè)小數(shù)點(diǎn),后面的小數(shù)點(diǎn)就無(wú)效了,同時(shí)parseFloat()只識(shí)別是十進(jìn)制值,所以沒(méi)有第二個(gè)參數(shù),別的格式數(shù)值會(huì)被解析為0。
var num = parseFloat("123Hello"); //123 var num = parseFloat("0xA"); //0 var num = parseFloat("12.1"); //12.1 var num = parseFloat("12.1.1"); //12.1 var num = parseFloat("023"); //23 var num = parseFloat("1.1e3"); //1100
String類(lèi)型值由若干個(gè)Unicode字符組成的字符序列構(gòu)成,可以由單引號(hào)('')或者雙引號(hào)("")表示,但是左右引號(hào)必須匹配。
var str1 = "abc"; var str2 = 'abc';<br>var str3 = "abc'; //語(yǔ)法錯(cuò)誤
將一個(gè)值顯式轉(zhuǎn)換為字符串有兩種方法,toString()和String(),數(shù)值、布爾值、對(duì)象和字符串都有toString()方法和String()方法,而undefined和null只有String()方法,toString()的參數(shù)是轉(zhuǎn)換的進(jìn)制格式。
var num = 10; alert(num.toString()); //"10" alert(num.toString(2)); //"1010" alert(num.toString(8)); //"12" alert(num.toString(10)); //"10" alert(num.toString(16)); //"A" alert(true.toString()); //"true" String(num); //"10" String(true); //"true" String(null); //"null" var num1; String(num1); //"undefined"
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- js 數(shù)據(jù)類(lèi)型轉(zhuǎn)換總結(jié)筆記
- JavaScript中的數(shù)據(jù)類(lèi)型轉(zhuǎn)換方法小結(jié)
- JavaScript實(shí)現(xiàn)數(shù)據(jù)類(lèi)型的相互轉(zhuǎn)換
- 詳解Javascript數(shù)據(jù)類(lèi)型的轉(zhuǎn)換規(guī)則
- JavaScript中數(shù)據(jù)類(lèi)型轉(zhuǎn)換總結(jié)
- JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換原則(干貨)
- JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換詳解(推薦)
- JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換簡(jiǎn)單方法舉例
相關(guān)文章
使用js簡(jiǎn)單實(shí)現(xiàn)了tree樹(shù)菜單
使用js簡(jiǎn)單實(shí)現(xiàn)了樹(shù)菜單!具體實(shí)現(xiàn)實(shí)例代碼如下,相信自己你一定可以實(shí)現(xiàn)的更好2013-11-11JS中使用apply、bind實(shí)現(xiàn)為函數(shù)或者類(lèi)傳入動(dòng)態(tài)個(gè)數(shù)的參數(shù)
這篇文章主要介紹了JS中使用apply、bind實(shí)現(xiàn)為函數(shù)或者類(lèi)傳入動(dòng)態(tài)個(gè)數(shù)的參數(shù)的相關(guān)資料,需要的朋友可以參考下2016-04-04JS使用new操作符創(chuàng)建對(duì)象的方法分析
這篇文章主要介紹了JS使用new操作符創(chuàng)建對(duì)象的方法,結(jié)合實(shí)例形式分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)類(lèi)的定義、new操作符對(duì)象的創(chuàng)建及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-05-05js獲取當(dāng)前年月日-YYYYmmDD格式的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇js獲取當(dāng)前年月日-YYYYmmDD格式的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript隨機(jī)數(shù)的組合問(wèn)題案例分析
這篇文章主要介紹了JavaScript隨機(jī)數(shù)的組合問(wèn)題,結(jié)合具體案例形式分析了JavaScript隨機(jī)數(shù)的組合問(wèn)題相關(guān)算法原理、實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05js 判斷圖片是否加載完以及實(shí)現(xiàn)圖片的預(yù)下載
這篇文章主要介紹了js 判斷圖片是否加載完以及實(shí)現(xiàn)圖片的預(yù)下載,需要的朋友可以參考下2014-08-08JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)視頻添加水印的示例代碼
這篇文章主要介紹了通過(guò)js給網(wǎng)頁(yè)視頻添加水印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Javascript & DHTML DOM基礎(chǔ)和基本API
DOM是文檔對(duì)象模型(Document Object Model,是基于瀏覽器編程(在本教程中,可以說(shuō)就是DHTML編程)的一套API接口,W3C出臺(tái)的推薦標(biāo)準(zhǔn),每個(gè)瀏覽器都有一些細(xì)微的差別,其中以Mozilla的瀏覽器最與標(biāo)準(zhǔn)接近。2008-07-07JavaScript檢查數(shù)據(jù)中是否存在相同的元素(兩種方法)
這篇文章主要介紹了JavaScript檢查數(shù)據(jù)中是否存在相同的元素(兩種方法),需要的朋友可以參考下2018-10-10數(shù)組方法解決JS字符串連接性能問(wèn)題有爭(zhēng)議
大多數(shù)情況下,加法運(yùn)算符是首選;如果用戶(hù)主要使用IE6或7,并且字符串大小較大或數(shù)量較多時(shí),那么數(shù)組技術(shù)就很值得。2011-01-01