變量
ECMAScript中的變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數(shù)據(jù)。換句話說也颤,每個變量僅僅是一個用于保存值的占位符炫隶。
var
可以聲明一個變量,一般情況下,要想聲明的變量變得有意義少漆,必須得初始化厅须,即給變量賦值侧馅。
有一點必須注意危尿,即用var操作符定義的變量將成為定義該變量的作用域中局部變量。也就是說馁痴,如果在函數(shù)中使用var定義一個變量谊娇,那么這個變量在函數(shù)執(zhí)行完之后,會被立即銷毀罗晕,回收其占用的內(nèi)存济欢。例如:
function test(){
var message = 'hello world'//不用var操作符聲明的變量,會變成全局變量
console.dir(message)
}
test();
test函數(shù)運行以后小渊,變量message會被垃圾清除機制清除法褥,釋放其內(nèi)存。
數(shù)據(jù)類型
5種簡單數(shù)據(jù)類型:String
,Number
,Boolean
,Undefined
,Null
1中復雜數(shù)據(jù)類型:Object
一般情況下酬屉,會用typeof
操作符檢測給定變量的數(shù)據(jù)類型半等。
當調(diào)用typeof null
時候,會返回object
,因為null
本質(zhì)上是空對象呐萨,程序上標明此變量在未來指向的變量是一個對象杀饵。
這里有幾點需要注意:
1.檢測函數(shù)的時候:
function test(){};
console.log(typeof test)//'function'
當用typeof檢測一個函數(shù)的時候,會返回‘‘第六種數(shù)據(jù)類型’’谬擦,為什么會用引號括起來呢切距,因為從技術(shù)角度來說,函數(shù)在ECMAScript中是對象惨远,不是一種數(shù)據(jù)類型谜悟。然而,函數(shù)也確實有一些特殊的屬性北秽,因此通過typeof
操作符來區(qū)分函數(shù)和其他對象是有必要的赌躺。
2.檢測數(shù)組的時候:
var arr = [1,2,3];
console.log(typeof arr)//'object'
當用typeof
檢測的變量是一個數(shù)組時候,會直接返回object
羡儿。所以數(shù)組也是對象的一種,同是復雜數(shù)據(jù)類型是钥。
Undefined類型
Undefined類型只有一個值掠归,即特殊的undefined
。
這里有一點需要注意:在使用var
聲明變量但未對其初始化時悄泥,這個變量的值就是undefined
虏冻。
var message;
alert(message == undefined)//true
引入這個值是為了正式區(qū)分空對象指針和未初始化的變量。
Null類型
Null類型是第二種只有一個值的數(shù)據(jù)類型弹囚,這個特殊值就是null
厨相。
實際上,undefined
是派生自null
值的。因此undefined
== null
蛮穿。
上文提到庶骄,如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null
而不是其他值践磅。這樣单刁,在復雜的業(yè)務邏輯
中,debug代碼判定動態(tài)數(shù)據(jù)類型時候府适,只要直接檢測null
值就可以知道相應的變量是否已經(jīng)保存了一個對象的引用羔飞。
Boolean類型
Boolean類型是使用的最多的一種類型,有兩個值:true
和false
檐春。
Boolean類型的字面值true
和false
是區(qū)分大小寫的逻淌,也就是True
和False
都不是Boolean的值,只是標識符疟暖。
想要講一個值轉(zhuǎn)換為對應的Boolean值卡儒,可以用Boolean()
。
以下給出各種數(shù)據(jù)類型及其對應的轉(zhuǎn)換規(guī)則:
Number類型
整數(shù)
最基本的數(shù)值字面量格式是十進制的誓篱,除了以十進制表示以外朋贬,證書還可以通過八進制和十六進制的字面值來表示。其中窜骄,八進制字面值第一位必須是零锦募,然后是八進制數(shù)字序列(0-7)。如果字面數(shù)值超出了范圍邻遏,那么前導零將被忽略糠亩,后面的數(shù)值將被當做十進制數(shù)值解析。八進制字面量在嚴格模式下是無效的准验,會拋出錯誤赎线。十六進制字面量的前兩位必須是0x,后跟任何十六進制數(shù)字(0-9及A-F)糊饱,其中垂寥,字母A-F可以大寫也可以小寫。
不過在進行算數(shù)計算時另锋,所有以八進制和十六進制表示的數(shù)值都會轉(zhuǎn)換為十進制數(shù)值滞项。
浮點數(shù)
由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)數(shù)值的兩倍,所以ECMAScript會把浮點數(shù)轉(zhuǎn)為整數(shù)顯示夭坪。例如:
var float1 = .1;
var float2 = 10.0;
console.log(float1)//1
console.log(float2)//10
對于那些極大或者極小的數(shù)值文判,可以用科學計數(shù)法表以浮點數(shù)值的形式來表示。例如:
var floatNum = 1.234e6; //等于1234000
即e前面的數(shù)值乘以e后面數(shù)值的10的指數(shù)次冪室梅。極小數(shù)同理戏仓,只不過是除以10的指數(shù)次冪疚宇。
由于浮點數(shù)值的最高精度是17位小數(shù),但是在進行算數(shù)計算的精確度缺遠不如整數(shù)赏殃,所以不建議用0.1+0.2==0.3
這樣的判斷敷待。
數(shù)值范圍
數(shù)值類型的數(shù)據(jù)有大小之分,或是無窮大或是無窮小或是在這兩者之間嗓奢。ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE
中-在大多數(shù)瀏覽器中讼撒,這個值是5e-324
,能夠表示的最大數(shù)值保存在Number.MAX_VALUE
中-在大多數(shù)瀏覽器中股耽,這個值是1.7976931348623157e+308
根盒。
如果一旦超出了javascript數(shù)值范圍,這個值是正數(shù)物蝙,則用Infinity
(正無窮)表示炎滞,這個值是負數(shù),則用-Infinity
(負無窮)表示诬乞。
如果想要確定一個數(shù)值類型的值是否是有窮的册赛,可以使用isFinite()
這個函數(shù)。如果這個函數(shù)的參數(shù)位于最大與最小數(shù)值之間會返回true
震嫉。
NaN
NaN
即非數(shù)值(Not a Number)森瘪,是一個特殊的數(shù)值。typeof NaN == 'number'
NaN
本身有兩個特點:
1.任何涉及NaN的操作都會返回NaN票堵。
2.NaN與任何值都不相等扼睬,包括它自己。
alert(NaN == NaN)//false
ECMAScript定義了一個isNaN()函數(shù)悴势,用來判斷一個數(shù)值是否 ’不是數(shù)值‘窗宇,這個函數(shù)在接受一個參數(shù)之后,會先進行轉(zhuǎn)換操作特纤,轉(zhuǎn)換為數(shù)值军俊。
數(shù)值轉(zhuǎn)換
有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()
,parseInt()
,parseFloat()
。
其中捧存,Number()
函數(shù)可以用于任何數(shù)據(jù)類型粪躬,而后兩者則專門用于字符串轉(zhuǎn)換為數(shù)值。
Number()
:
Number()
轉(zhuǎn)換規(guī)則如下:
1.如果是Boolean類型值昔穴,true
和false
會被轉(zhuǎn)換為1
和0
镰官。
2.如果是數(shù)字,只是簡單的傳入和返回傻咖。即Number(10.11) == 10.11
。
3.如果是null
岖研,返回0卿操。
4.如果是字符串警检,則遵循以下規(guī)則:
a:如果只包含數(shù)字,則轉(zhuǎn)換為十進制數(shù)值害淤,例如 Number('23411') == 23411
扇雕。
b:如果字符串中包含有效的浮點格式,則將其轉(zhuǎn)換為對應的浮點數(shù)值窥摄,例如Number('1.1') == 1.1
镶奉。
c:如果字符串中包含有效的十六進制格式,則將起轉(zhuǎn)換為相同大小的十進制整數(shù)崭放。
d:如果字符串是空的哨苛,則將起轉(zhuǎn)換為0。
e:如果字符串中包含除上述格式之外的字符币砂,則將其轉(zhuǎn)換為NaN
建峭。
parseInt()
:
parseInt()
函數(shù)在轉(zhuǎn)換字符串時,更多的是看其是否符合數(shù)值模式决摧,其轉(zhuǎn)換規(guī)則如下:
1.忽略字符串前面的空格亿蒸。
2.如果字符串中第一個字符不是數(shù)字字符或者負號,則返回NaN
掌桩,例如parseInt(a123) == NaN
边锁。
3.如果字符串中第一個字符是數(shù)字,則會繼續(xù)解析第二個字符波岛,知道解析完所有后續(xù)字符或者遇到一個非數(shù)字字符茅坛,例如parseInt('123abc345') == 123
。
parseInt()
函數(shù)還會接收第二個參數(shù)盆色,用于表示轉(zhuǎn)化字符串時灰蛙,用哪個進制,以十進制或者八進制或者十六進制進行轉(zhuǎn)換隔躲。例如:
var num1 = parseInt('10',2) //2(按照二進制解析)
var num2 = parseInt('10',8) //8(按照八進制解析)
var num3 = parseInt('10',10) //10(按照十進制解析)
var num4 = parseInt('10',16) //16(按照十六進制解析)
parseFloat()
parseFloat()
也是從第一個字符開始進行解析摩梧。一直解析到字符串末尾或者解析到遇見一個無效的浮點數(shù)字字符為止,也就是第一個小數(shù)點有效宣旱,第二個無效仅父。例如parseFloat('123.12.3') == 123.12
。
除了第一個小數(shù)點有效以外浑吟,parseInt()
和parseFloat()
的第二個區(qū)別在于它始終會忽略前導零笙纤,即假如這個字符串是十六進制值,parseFloat()
始終會吧十六進制值轉(zhuǎn)換為0组力。
parseFloat()
只解析十進制值省容,因此沒有第二個參數(shù)的用法。
最后還要注意一點:如果字符串包含的是一個可解析為整數(shù)的數(shù)(沒有小數(shù)點燎字,或者小數(shù)點后都是零)腥椒,parseFloat()
會返回整數(shù)阿宅。
String類型
String類型即字符串。必須由雙引號或者單引號表示笼蛛。
任何字符串的長度都可以通過訪問其length屬性獲得洒放。
要把一個值轉(zhuǎn)換為字符串有兩種方法。
1.toString()
方法:
數(shù)值滨砍,布爾值往湿,對象和字符串值都有toString()
方法,但是null
和undefined
值沒有這個方法惋戏。
2.String()
方法:
在不知道要轉(zhuǎn)換的值是不是null
或者undefined
的情況下领追,還可以使用轉(zhuǎn)型函數(shù)String()
,這個函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串日川。轉(zhuǎn)換規(guī)則如下:
a:如果值有toString()
方法蔓腐,則返回相應的結(jié)果。
b:如果是null
龄句,則返回null
(null的字面量)
c:如果是undefined
回论,則返回undefined
(undefined的字面量)
Object類型
ECMAScript中的對象其實就是一組數(shù)據(jù)和功能的集合。前面提到的函數(shù)也可以稱之為對象分歇,但是函數(shù)不能稱為數(shù)據(jù)類型傀蓉。對象可以通過new
操作符后面跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。例如var obj = new Object()
职抡。
創(chuàng)建Object類型的實例并為其添加屬性或者方法葬燎,就可以創(chuàng)建自定義的對象。而且缚甩,可以為對象動態(tài)的添加屬性和方法谱净。
Object類型所具有的任何屬性和方法同樣存在于更劇透的對象或者實例中。
1.constructor
:保存用于創(chuàng)建當前對象的函數(shù)擅威,即構(gòu)造函數(shù)壕探。對于前面的例子而言,obj.constructor == Object()
郊丛。
2.hasOwnProperty(propertyname)
:用于檢查給定的屬性在當前對象實例中是否存在(而不是在實例的原型中)李请,返回值為Boolean。其中propertyname
必須是字符串形式厉熟。
3.isPrototypeOf(object):用于檢查傳入的對象是否是當前對象的原型导盅。返回值是Boolean類型。
當然揍瑟。還有其他幾個方法白翻,不過這里只提出來常用的幾個方法和屬性。