一、數(shù)據(jù)類型
1.前言
最近會把讀《Javascript高級程序設計(第三版)》 密碼:2vp3 這本書的一些要點,一一分享給大家,這是第一篇基本數(shù)據(jù)類型。我已經把此書的網盤鏈接分享出來了,有興趣的可以看下,JavaScript進階必看。
2.類型
ECMAScript有5種基本數(shù)據(jù)類型:undefined、Null、Boolean、Number、String ; 一種復雜數(shù)據(jù)類型 Object; 當然還有ES6新增數(shù)據(jù)類型 Symbol ,標示獨一無二的值。
1).typeof操作符
由于下面很多例子都用到這個操作符,所以先提前講解下,這個操作符其實就是檢測數(shù)據(jù)類型的。
typeof undefined ===> undefined
typeof boolean ===> boolean
typeof string ===> string
typeof number ===> number
typeof object(**null**) ===> object
typeof function ===> function
2).undefined 類型
未經初始化的類型即為undefined;因此我們沒有必要顯示的給未初始化的變量顯式的設置為undefined,因為它已經默認了,未初始化的值就會取undefined值
var data; alert(data == undefined)//true
這地方有一個需要大家注意的地方,未聲明的變量和未初始化的變量在使用typeof操作符的時候都會返回undefined
//這個變量聲明但為初始化 默認值:undefined
var message;
console.log(typeof message);//undefined
console.log(typeof a);//a 為聲明
雖然未初始化的變量會默認設置為undefined,但是我們顯式的初始化變量時設置undefined也是很明智的選擇,因為這樣我們可以通過typeof操作符返回undefined時,來檢測變量是還沒聲明,而不是尚未初始化。
3).Null類型
Null類型只有一個值就是null,它指向一個空指針對象,所以用typeof操作符檢測的時候,返回Object。當我我們定義一個變量用來保存對象的時候,我們最好把這個變量初始化為null,這樣一來我們只需要檢測null值就可以知道相應的變量是否已經保存了一個對象的引用。
var o = null;
if(o != null){do something.....}
更有趣的是 null 和 undefined 是相等的(==) 如:
console.log(null == undefined);//true
undefiend實際上派生之null值的。上面的例子中操作符 == 總是返回 true,其實它們比較的時候 是轉換為相關操作數(shù)再比較的,之后的文章會講到。
4).Boolean類型
Boolean類型,感覺在開發(fā)過程中是用到最多的類型之一了吧。就倆個值:true/ false ,需要注意的是 由于JavaScript 是區(qū)別大小寫的,TRUE和FALSE, 并不代表布爾值,只是一個簡單的標識符。要講其他類型的值轉換為Boolean,只需要調用Boolean(xxx)
數(shù)據(jù)類型 轉換為true的值 轉換為false的值
Boolean true false
String 任何非空字符串 ''(空字符串)
Number 任何非0數(shù)字(包括無窮大) 0 和 NaN(非數(shù)字類型not a number)
Object 任何不為null的對象 null
Undefined 無 undefined
5).Number類型
最基本的數(shù)據(jù)類型就是十進制:var a = 10;
八進制:八進制第一位必須是0,然后數(shù)字序列(0-7)如果字面值中的數(shù)字超出了范圍,那么前面的零會忽略,后面的數(shù)字被當作十進制去解析:
var oc1 = 070; 八進制的 56 > 7 * (8 * 1);
var oc2 = 079 ; 無效的八進制 解析為79;
var oc2 = 08 ; 無效的八進制 解析為8;
八進制在嚴格模式下無效,會保錯
十六進制:前倆位是0x,后跟任何十六進制數(shù)字(0-9,A-F(可大寫也可小寫))
var h = 0xA ; // 十六進制10
var b = 0x1f; // 十六進制的31
Number保存的最小數(shù)字是:Number.MIN_VALUE 這個值是5e-324。
保存的最大值保存在Number.MAX_VALUE 這個值是 1.7976931348621357e+308; 如果在計算過程中超出了數(shù)值范圍的話,就會返回一個無窮大 Infinity或者 -Infinity,這里注意不管是正無窮大還是負無窮大都不能參與運算。如果想判斷一個數(shù)字是不是有窮的(最大和最小之間的數(shù)字),可以使用 isFinite()函數(shù),如下例子:
isFinite(2);//true
isFinite(NaN);//false
6).NaN
NaN,即非數(shù)值(not a number),它其實是一個特殊的數(shù)值,用來表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。
NaN有倆個很非同尋常的特點,即任何涉及NaN的操作都返回NaN,NaN不與任何值相等
console.log(NaN/10);//NaN
console.log(NaN==NaN);//false
其中有個函數(shù)用來判斷某個值是不是 不是數(shù)字。
console.log(isNaN(1));//false
console.log(isNaN('10'));false 可以轉換為數(shù)字10
console.log(isNaN(true));//false 轉換數(shù)字1
console.log(isNaN(NaN));//true
console.log(isNaN('s'));//true 不能轉換為數(shù)字
isNaN()也其實適用對象,調用對象的時候,首頁調用對象的valueOf()方法,然后確定該方法是否可以轉換為數(shù)字,如果還是不能轉換,就調用toString()方法,再繼續(xù)測試是否可以轉換為數(shù)字。
其中有三個函數(shù)可以把非數(shù)值轉換為數(shù)值:Number() parseInt() parseFloat();
Number():可以用于任何數(shù)據(jù)類型;它的轉換規(guī)則如下:
①:如果是Boolean的值,true和false分別轉換為 1 和 0;
②:如果是數(shù)字值,只是簡單的傳入和返回;
③:如果是null,則返回0;
④:如果是undefined則返回NaN;
⑤:如果是字符串中只包含數(shù)字(包括正負),則轉換為十進制 Number('0')=>0; Number('123')=>123 Number('012')=> 12;如果字符串中包含浮點數(shù)字的,則返回相應的浮點數(shù)值;如果字符中含有十六進制的格式,則這轉換為相同大小的十進制數(shù)。
⑥:如果字符串為空,則轉換為0
⑦:如果字符中包含上述之外的字符,則返回 NaN;
⑧:對象,調用對象的時候,首頁調用對象的valueOf()方法,然后確定該方法是否可以轉換為數(shù)字,如果還是不能轉換,就調用toString()方法,再繼續(xù)按照上述規(guī)則測試返回的字符串;
parseInt():用于字符串轉換為數(shù)值;它會忽略前面的空格,直到找到第一個非空字符串,如第一個字符串不是數(shù)字字符或者負號,它會返回NaN, 所以 它轉換空字符的時候 返回NaN; 如果第一個是數(shù)字符串,它會繼續(xù)解析第二個。直到解析完或者遇到了一個非數(shù)字字符。它還能識別各種進制的數(shù)字字符,例子:
parseInt(123red)===> 123
parseInt(22.5) ==> 22(小數(shù)點不是有效的數(shù)字符)
parseInt("");NaN
parseInt('OxA')://10 十六進制轉換十進制
parseInt('070');//56 八進制
parseInt("70");// 70 十進制
其實 這個函數(shù)還提供了第二個參數(shù),轉換是使用的基數(shù)(多少進制)
parseInt('0xAF',16);//175
parseFloat():這個函數(shù)和parseInt函數(shù)一樣,不過這個函數(shù)在第一個小數(shù)點是有效的,第二個小數(shù)點就無效了。; 該函數(shù)始終忽略前導0,所以十六進制始終返回0,并且只解析十進制;還有一個要注意的是:如果要解析的字符串是一個可解析為整數(shù)的數(shù)(沒有小數(shù)點,或者小數(shù)點后都是零)則返回整數(shù)。如下??:
parseFloat('1234bbbb');//123
parseFloat('0xAF');//0
parseFloat('22.5');//22.5
parseFloat('22.34.5');//22.34
parseFloat('098.5');// 98.5
parseFloat('3.125e7');// 3125000
7).String類型
字符串類型,字符串可以使用單引號''或者雙引號""標示。這倆種字符串的解析是一樣的,不像PHP字符串的那樣。但是以雙引號開始,必須以雙引號結束,單引也是一樣。
字符串中有一些特殊的字符字面量,也叫轉義字符。如下:
字面量 含義
\n 換行
\t 制表
\b 空格
\r 回車
\f 進制
\\ 斜杠
\' 單引號 在字符串中使用
\" 雙引號 在字符串中使用
如要獲得字符串的長度可以使用length屬性;
字符串創(chuàng)建之后就不能改變了,要想改變必須銷毀原來的字符串,然后用一個新的字符串填充該變量。
如果想把一個值轉換為字符串有倆種方法:
① toString():每個字符串都有該方法,返回字符串的一個副本。對象、數(shù)值、布爾值、字符串都有該方法。但是undefined和null沒有。這個方法也可以傳一個參數(shù) 標示輸出 多少進制。
② String(): 這個方法可以將任何值轉換為字符串;轉換規(guī)則:如果該值有toString方法,則調用;如果是 null 則返回 “null” ; 如果是 undefined 則返回 "undefined"
console.log(String(10));// '10'
console.log(String(true));// 'true'
console.log(String(null));// 'null'
var par1;
console.log(String(par1));// 'undefined'
8).Object類型
在ECMAScript中 對象就是數(shù)據(jù)和功能的結合體,對象可以通過new操作符跟要創(chuàng)建的對象類型名稱來創(chuàng)建
var o = new Object()
每個對象都有下列屬性和方法:
① Constructor: 保存著用于創(chuàng)建當前對象的函數(shù);上面的例子 constructor 就是 Object()
② hasOwnProperty(propertyName): 檢測給定屬性是否存在改對象實例中 ,參數(shù)屬性名必須是字符串
③ isPrototypeOf(object) :檢測傳入的對象是否是另一個對象的原型(后期會寫相關文章)
④ propertyIsEnumerable(propertyName): 檢測屬性是否能夠用 for-in語句枚舉 參數(shù)必須是字符串
⑤ toLocaleString() 返回對象的字符串標示,該字符串與執(zhí)行環(huán)境的地區(qū)對應
⑥ toSting() 返回對象的字符串標示
⑦ valueOf() 返回對象的字符串、數(shù)值 或 布爾值 .返回對象的原始值 方法用來把對象轉換成原始類型的值(數(shù)值、字符串和布爾值) 默認情況下, valueOf() 會被每個對象Object繼承。每一個內置對象都會覆蓋這個方法為了返回一個合理的值,如果對象沒有原始值,valueOf() 就會返回對象自身
注意:如果我們沒有重新定義valueOf和toString,其隱式轉換會調用默認的toString()方法,將函數(shù)本身內容作為字符串返回;
如果我們自己重新定義toString/valueOf方法,那么其轉換會按照我們的定義來,其中valueOf比toString優(yōu)先級更高
例子:
function fn() {
return 20;
}
console.log(fn + 10);
console.log(fn + 'hello');
fn.toString = function() {
return 10;
}
console.log(fn + 10);
console.log(fn + 'hello');
fn.valueOf = function() {
return 5;
}
console.log(fn + 10);
console.log(fn + 'hello');
// 輸出結果分別是多少?
function fn() {
return 20;
}10
function fn() {
return 20;
}hello
20
10hello
15
5hello
二、總結
以上就是我們JavaScript的相關基本數(shù)據(jù)類型,如有不足之處,歡迎指正。下篇文章我們會講解函數(shù),盡情期待!