JavaScript學(xué)習(xí)筆記整理(2):類型、值和變量

2018-06-19 11:57 更新

1、數(shù)據(jù)類型

JavaScript語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類型。 JavaScript共有六種數(shù)據(jù)類型:

數(shù)值(number):整數(shù)和小數(shù) 字符串(string):字符組成的文本 布爾值(boolean):true和false兩個(gè)特定值。 undefined:表示未定義或不存在。 null:表示空缺,即此處應(yīng)該有一個(gè)值,但此時(shí)為空。 對(duì)象(object):各種值組成的集合。

通常,我們將數(shù)值、字符串、布爾值稱為原始類型(primitive type),即它們是最基本的數(shù)據(jù)類型,無(wú)法再細(xì)分了。而將對(duì)象稱為合成類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器。至于undefined和null,一般將它們看成兩個(gè)特殊值。
JavaScript中除了數(shù)字、字符串、布爾值、null和undefined之外就是對(duì)象了。 對(duì)象(object)是屬性(property)的集合,每個(gè)屬性都由“名/值對(duì)”構(gòu)成。

2、typeof運(yùn)算符

在JavaScript中,我們可以用typeof運(yùn)算符來(lái)確定一個(gè)值到底是什么類型。

(1)原始類型
數(shù)值、字符串、布爾值分別返回number、string、boolean。

typeof 12  // "number"

typeof '12'  // "string"

typeof false //"boolean"

(2)函數(shù) 函數(shù)返回function。

function a(){}

typeof a   // "function"

(3)undefined undefined返回undefined。

typeof undefined   // "undefined"

可用typeof檢測(cè)一個(gè)變量是否聲明。

if(typeof a === "undefined" ){

}

(4)其他 除此以外,其他情況都返回object

typeof window  // "object"

typeof {}  // "object"

typeof []  // "object"

typeof null // "object"

3、數(shù)值

JavaScript不區(qū)分整數(shù)值和浮點(diǎn)數(shù)值。JavaScript中的所有數(shù)字均用浮點(diǎn)數(shù)值表示。 JavaScript采用IEEE 754標(biāo)準(zhǔn)定義的64位浮點(diǎn)格式表示數(shù)字。
數(shù)值范圍
-9007199254740992 ~ 9007199254740992 (-2的53次方 ~ 2的53次方)。當(dāng)數(shù)值超過了此范圍的整數(shù),則無(wú)法保證低位數(shù)字的精度。 JavaScript中實(shí)際的操作則是基于32位整數(shù)。 使用字面量(literal)時(shí),JavaScript對(duì)整數(shù)提供四種進(jìn)制的表示方法:十進(jìn)制、十六進(jìn)制、八進(jìn)制、2進(jìn)制。

十進(jìn)制:沒有前導(dǎo)0的數(shù)值。 八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0、且只用到0-7的七個(gè)阿拉伯?dāng)?shù)字的數(shù)值。 十六進(jìn)制:有前綴0x或0X的數(shù)值。 二進(jìn)制:有前綴0b或0B的數(shù)值。

在十六進(jìn)制中,0~9之間的數(shù)字和a(A)~f(F)之間的字母構(gòu)成,a~f的字母對(duì)應(yīng)的表示數(shù)字10~15 在浮點(diǎn)數(shù)中,我們還可以用指數(shù)記數(shù)法來(lái)表示,即在實(shí)數(shù)后跟字母e或E,后面再跟正負(fù)號(hào),其后再加一個(gè)整型的指數(shù)。這種記數(shù)方法表示的數(shù)值,是由前面的實(shí)數(shù)乘以10的指數(shù)次冪。

12e3   /// 12*10*10*10=12000

在兩種情況下,JavaScript會(huì)自動(dòng)將數(shù)值轉(zhuǎn)為科學(xué)計(jì)數(shù)法表示: (1)小數(shù)點(diǎn)前的數(shù)字多于21位

1234567890123456789012 // 1.2345678901234568e+21

(2)小數(shù)點(diǎn)后的零多于5個(gè)

// 小數(shù)點(diǎn)后緊跟5個(gè)以上的零, // 就自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法 0.0000003 // 3e-7

特殊數(shù)值
正零和負(fù)零
在JavaScript內(nèi)部,實(shí)際上存在2個(gè)0:一個(gè)是+0,一個(gè)是-0。它們是等價(jià)的。

-0 === +0 //true


Infinity
當(dāng)JavaScript在算術(shù)運(yùn)算時(shí)發(fā)生溢出(overflow)、下溢(underflow)或被零整除時(shí)不會(huì)報(bào)錯(cuò)。

當(dāng)數(shù)字運(yùn)算結(jié)果超過了JavaScript所能表示的數(shù)字上限(溢出),結(jié)果為一個(gè)特殊的無(wú)窮大(Infinity)值。同樣,當(dāng)負(fù)數(shù)的值超過了JavaScript所能表示的負(fù)數(shù)范圍,結(jié)果為負(fù)無(wú)窮大(-Infinity)。

Infinity大于一切數(shù)值(除了NaN),-Infinity小于一切數(shù)值(除了NaN)。

isFinite函數(shù)返回一個(gè)布爾值,檢查某個(gè)值是不是正常數(shù)值,而不是Infinity。

注意:0除以0是無(wú)意義的,會(huì)返回NaN。
NaN
NaN用來(lái)表示非數(shù)字值。

NaN不等于任何值,包括它本身。

NaN === NaN  //false

isNaN方法可以用來(lái)判斷一個(gè)值是否為NaN。

isNaN(NaN)  //true

isNaN(12)  //false

注意:isNaN只對(duì)數(shù)值有效,如果傳入其他值,會(huì)被先轉(zhuǎn)成數(shù)值。比如,傳入字符串的時(shí)候,字符串會(huì)被先轉(zhuǎn)成NaN,所以最后返回true,這一點(diǎn)要特別引起注意。也就是說,isNaN為true的值,有可能不是NaN,而是一個(gè)字符串。

isNaN('a') //true


一般來(lái)說,使用isNaN之前,最好判斷一下數(shù)據(jù)類型。

typeof value === 'number' && isNaN(value)

判斷NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值這個(gè)特點(diǎn),進(jìn)行判斷。

value !== value

4、字符串

字符串就是零個(gè)或多個(gè)排在一起的字符,放在單引號(hào)或雙引號(hào)之中。

'a'

"a"

單引號(hào)字符串的內(nèi)部,可以使用雙引號(hào)。雙引號(hào)字符串的內(nèi)部,可以使用單引號(hào)。
如果要在單引號(hào)字符串的內(nèi)部,使用單引號(hào)(或者在雙引號(hào)字符串的內(nèi)部,使用雙引號(hào)),就必須在內(nèi)部的單引號(hào)(或者雙引號(hào))前面加上反斜杠,用來(lái)轉(zhuǎn)義。

'a \'b\' '

字符串默認(rèn)只能寫在一行中。如果要拆分成數(shù)行,每行必須以反斜杠(\)結(jié)束。

var a = " Hello \

world \

! \";

推薦在HTML中使用雙引號(hào),在JavaScript中使用單引號(hào)。

在JavaScript中,我們可以用加號(hào)(+)來(lái)連接字符串。

var a = 'Hello' + 'world';

字符串可以被視為字符數(shù)組,因此可以使用數(shù)組的方括號(hào)運(yùn)算符,用來(lái)返回某個(gè)位置的字符(位置編號(hào)從0開始)。

var a = 'hello';

a[0]  // "h"

a[1]  // "e"

length屬性返回字符串的長(zhǎng)度,該屬性也是無(wú)法改變的。

如果方括號(hào)中的數(shù)字超過字符串的長(zhǎng)度,或者方括號(hào)中根本不是數(shù)字,則返回undefined。

注意:字符串與數(shù)組僅僅是相似而已。字符串是無(wú)法改變字符串之中的單個(gè)字符。

var a = 'hello';

delete s[0];

s // "hello"


s[0] = 'a';

s  // "hello"

轉(zhuǎn)義

反斜杠(\)在字符串內(nèi)有特殊含義,用來(lái)表示一些特殊字符,所以又稱為轉(zhuǎn)義符。 需要用反斜杠轉(zhuǎn)義的特殊字符,主要有下面這些:

\0 null(\u0000) \b 后退鍵(\u0008) \f 換頁(yè)符(\u000C) \n 換行符(\u000A) \r 回車鍵(\u000D) \t 制表符(\u0009) \v 垂直制表符(\u000B) \' 單引號(hào)(\u0027) \" 雙引號(hào)(\u0022) \ 反斜杠(\u005C)

5、null和undefined

null是JavaScript語(yǔ)言的關(guān)鍵字,常用來(lái)描述“空值”。 對(duì)null執(zhí)行typeof運(yùn)算,結(jié)果會(huì)返回“object”,也就是說,可以將null認(rèn)為是一個(gè)特殊的對(duì)象值。 undefined undefined表示“未定義”

注意:盡管null和undefined是不同的,但它們都表示“值的空缺”,兩者往往可以互換。當(dāng)用相等運(yùn)算符“==”來(lái)比較兩者時(shí),會(huì)返回true。(要使用嚴(yán)格相等運(yùn)算符“===”來(lái)區(qū)分它們)

6、布爾值

布爾值表示真或假。這個(gè)類型只有兩個(gè)值,保留字true 和false。 下列運(yùn)算符會(huì)返回布爾值:

兩元邏輯運(yùn)算符: && (And),|| (Or) 前置邏輯運(yùn)算符: ! (Not) 相等運(yùn)算符:===,!==,==,!= 比較運(yùn)算符:>,>=,<,<=

布爾值常用于JavaScript總的控制結(jié)構(gòu)中。例如,JavaScript中的if..else語(yǔ)句,如果布爾值為true執(zhí)行第一段邏輯,如果為false執(zhí)行另一段邏輯。 如果JavaScript預(yù)期某個(gè)位置應(yīng)該是布爾值,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true。

undefined null false 0 NaN ""或''(空字符串)

7、變量聲明

在JavaScript程序總,使用一個(gè)變量之前應(yīng)當(dāng)先聲明。 變量是使用關(guān)鍵字var來(lái)聲明的。 變量的聲明和賦值,是分開的兩個(gè)步驟,上面的代碼將它們合在了一起,實(shí)際的步驟是下面這樣。

var a; a=1;

JavaScirpt是一種動(dòng)態(tài)類型語(yǔ)言,也就是說,變量的類型沒有限制,可以賦予各種類型的值。 如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個(gè)JavaScript關(guān)鍵字,表示“無(wú)定義”。 如果一個(gè)變量沒有聲明就直接使用,JavaScript會(huì)報(bào)錯(cuò),告訴你變量未定義。
重復(fù)的聲明

如果使用var重新聲明一個(gè)已經(jīng)存在的變量,是無(wú)效的。

var a=1; var a; a //1

但是,如果第二次聲明的同時(shí)還賦值了,則會(huì)覆蓋掉前面的值。

var x=1; var x=2; x //2

聲明提前(變量提升)
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運(yùn)行。這造成的結(jié)果,就是所有的變量的聲明語(yǔ)句,都會(huì)被提升到代碼的頭部,這就是聲明提前(變量提升,hoisting)。

var scope='global'; function f(){ console.log(scope); //輸出‘undefined’,而不是‘global’ var scope='local'; //變量在這里賦初始值,但變量本身在函數(shù)體內(nèi)任何地方均是有定義的。 console.log(scope); //輸出‘local’ }

上面的代碼實(shí)質(zhì)是這樣執(zhí)行的:

var scope='global'; 

function f(){ 

    var scope;  //變量會(huì)提前到函數(shù)頭部執(zhí)行

    console.log(scope); //輸出‘undefined’,而不是‘global’ 

    scope='local'; //上面已經(jīng)聲明,這里只是賦值

    console.log(scope); //輸出‘local’ 

}


注意:變量提升只對(duì)var命令聲明的變量有效,如果一個(gè)變量不是用var命令聲明的,就不會(huì)發(fā)生變量提升。

變量作用域
全局變量:不在任何函數(shù)體內(nèi)聲明的變量。全局變量擁有全局作用域,在JavaScript代碼中的任何地方都是有定義的。
局部變量:在函數(shù)內(nèi)聲明的變量,只在函數(shù)體內(nèi)有定義。

在函數(shù)體內(nèi),局部變量的優(yōu)先級(jí)高于同名的全局變量。也就是說,如果函數(shù)內(nèi)聲明的一個(gè)局部變量或者函數(shù)參數(shù)中帶有的變量和全局變量重名,那么全局變量就被局部變量所覆蓋。


注意:在函數(shù)中使用var關(guān)鍵字進(jìn)行顯式申明的變量是做為局部變量,而沒有用var關(guān)鍵字,使用直接賦值方式聲明的是全局變量?! ?/div>



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)