JavaScript學習之路-數(shù)據(jù)類型

一、數(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ù),盡情期待!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容