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

2018-06-19 11:57 更新

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

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

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

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

2、typeof運算符

在JavaScript中,我們可以用typeof運算符來確定一個值到底是什么類型。

(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檢測一個變量是否聲明。

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

}

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

typeof window  // "object"

typeof {}  // "object"

typeof []  // "object"

typeof null // "object"

3、數(shù)值

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

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

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

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

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

1234567890123456789012 // 1.2345678901234568e+21

(2)小數(shù)點后的零多于5個

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

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

-0 === +0 //true


Infinity
當JavaScript在算術(shù)運算時發(fā)生溢出(overflow)、下溢(underflow)或被零整除時不會報錯。

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

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

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

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

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

NaN === NaN  //false

isNaN方法可以用來判斷一個值是否為NaN。

isNaN(NaN)  //true

isNaN(12)  //false

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

isNaN('a') //true


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

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

判斷NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值這個特點,進行判斷。

value !== value

4、字符串

字符串就是零個或多個排在一起的字符,放在單引號或雙引號之中。

'a'

"a"

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

'a \'b\' '

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

var a = " Hello \

world \

! \";

推薦在HTML中使用雙引號,在JavaScript中使用單引號。

在JavaScript中,我們可以用加號(+)來連接字符串。

var a = 'Hello' + 'world';

字符串可以被視為字符數(shù)組,因此可以使用數(shù)組的方括號運算符,用來返回某個位置的字符(位置編號從0開始)。

var a = 'hello';

a[0]  // "h"

a[1]  // "e"

length屬性返回字符串的長度,該屬性也是無法改變的。

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

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

var a = 'hello';

delete s[0];

s // "hello"


s[0] = 'a';

s  // "hello"

轉(zhuǎn)義

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

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

5、null和undefined

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

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

6、布爾值

布爾值表示真或假。這個類型只有兩個值,保留字true 和false。 下列運算符會返回布爾值:

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

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

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

7、變量聲明

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

var a; a=1;

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

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

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

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

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

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

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

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

var scope='global'; 

function f(){ 

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

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

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

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

}


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

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

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


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



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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號