1.1 數(shù)據(jù)類型
JavaScript的基本數(shù)據(jù)類型有undefined、null、boolean、number、string以及一種較為復(fù)雜的數(shù)據(jù)類型object。
由于JS的數(shù)據(jù)類型是松散類型的,因此需要使用typeof操作符對(duì)數(shù)據(jù)類型進(jìn)行檢測,這里著重提一下:
typeof null // "object"
typeof function // "function"
函數(shù)盡管不是一種數(shù)據(jù) 類型,但由于其特殊的屬性,有必要與其他數(shù)據(jù)類型進(jìn)行區(qū)分。
1.1.1 Undefined
在變量聲明但未定義時(shí),內(nèi)部會(huì)自動(dòng)為其賦值為undefined。不過,包含undefined值的變量與未聲明的變量之間仍然存在一些差別,我們來看下面兩段代碼:
var message // 該變量聲明后默認(rèn)為undefined
// age 為未聲明的變量
alert( message ) // "undefined"
alert( age ) // 發(fā)生錯(cuò)誤
var message // 該變量聲明后默認(rèn)為undefined
// age 為未聲明的變量
typeof message // "undefined"
typeof age // "undefined"
雖然在alert中age會(huì)產(chǎn)生錯(cuò)誤,但在typeof中未聲明的age也會(huì)返回undefined值,這是比較奇怪的現(xiàn)象!同時(shí),typeof是唯一地能對(duì)未聲明變量進(jìn)行的操作。
1.1.2 Null
null值表示一個(gè)空對(duì)象的指針,undefined實(shí)際上派生自null值,在JS的相等性測試中,兩者是相等的,注意這里的相等(==)與全等(===)不同。
null == undefined // true
1.1.3 Boolean
Boolean類型分為兩種,即true和false,這里要注意大小寫,Boolean是對(duì)大小寫敏感的。
在不同數(shù)據(jù)類型中,Boolean類型有不同的表現(xiàn)形式,具體見下表。
| 數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | " " ( 空字符串 ) |
| Number | 非零數(shù)字和無窮大 | 0或NaN |
| Object | 任何對(duì)象 | null |
| Undefined | n/a | undefined |
上表中Undefined一行中,n/a是not applicable的縮寫,意為 “ 不適用 ”
1.1.4 Number
Number類型使用IEEE754格式來表示整數(shù)和浮點(diǎn)數(shù)。浮點(diǎn)數(shù)的最高精度是17位小數(shù),但在進(jìn)行計(jì)算時(shí)它的精度遠(yuǎn)遠(yuǎn)不如整數(shù),如0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004。
if ( a+b == 0.3 ) { // 返回false,因此不要做這種測試!
alert ( " you got 0.3 " )
}
在JavaScript中,存在能夠保存的最大值Number.MAX_VALUE和最小值Number.MIN_VALUE,超過這兩個(gè)值即為Infinity和-Infinity。
該類型中有一個(gè)特殊的數(shù)值,即NaN(Not a Number),該值是為了防止在數(shù)值計(jì)算中返回非數(shù)值的情況,其本身有兩個(gè)特點(diǎn)。
- 涉及NaN的操作均會(huì)返回NaN;
- NaN與任何值都不想等,包括它自己。
數(shù)值轉(zhuǎn)換:Number ( )、parserInt ( )、parserFloat ( )之間的比較。Number ( )可以接受任何數(shù)據(jù)類型,而parserInt ( )、parserFloat ( )只能接受字符串類型
- ** Number ( ) **
- true => 1
- false 或 null => 0
- undefined => NaN
- string => 若為數(shù)字(包括二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制和浮點(diǎn)數(shù)),均轉(zhuǎn)換成十進(jìn)制對(duì)應(yīng)的數(shù)字;若為空字符串(" "),轉(zhuǎn)換為0;其他情況,均轉(zhuǎn)換為NaN
- object => 先調(diào)用valueOf( )方法,依次按照之前的規(guī)則進(jìn)行轉(zhuǎn)換,若返回為NaN,則調(diào)用toString( )方法,再依次按照前面的規(guī)則進(jìn)行轉(zhuǎn)換
-
parserInt ( ) 和 parserFloat ( )
parserInt ( )從第一個(gè)不為空格的數(shù)字字符開始檢測,直到檢測到非數(shù)字字符為止,它可以解析不同進(jìn)制的數(shù)值,并返回對(duì)應(yīng)十進(jìn)制的值,通過傳入第二個(gè)參數(shù),即進(jìn)制值來實(shí)現(xiàn);相比之下,parserFloat ( )只能解析十進(jìn)制的浮點(diǎn)數(shù),且能解析第一個(gè)小數(shù)點(diǎn),遇到第二個(gè)小數(shù)點(diǎn)會(huì)自動(dòng)忽略。
下面是一些常見的例子:
Number( "Hello World" ) // NaN
Number( undefined ) // NaN
Number( " " ) // 0
Number( "0000011" ) // 11
Number( true ) // 1
parseInt( "1234Joker" ) // 1234
parseInt( " " ) // 0
parseInt( "0xA" ) // 10
parseInt( 22.5 ) // 22
parseInt( "70" ) // 70
parseInt( "10", 2 ) // 2
parseInt( "10", 8 ) // 8
parseInt( "10", 10 ) // 10
parseInt( "10", 16 ) // 16
parseFloat( "0xA" ) // 0
parseFloat( "22.5" ) // 22.5
parseFloat( "22.4.5" ) // 22.4
1.1.5 String
String類型用于表示由零個(gè)或多個(gè)16位字符組成的Unicode字符組成的字符序列,即字符串??梢杂茫?)或者('),但兩邊的引號(hào)類型要相等。字符串帶有length屬性,用于表示字符串的長度。
要想將別的數(shù)據(jù)類型如數(shù)值、布爾值、對(duì)象和字符串轉(zhuǎn)換為字符串類型,可以使用toString( )方法,不過null和undefined值沒有這個(gè)方法,需要使用轉(zhuǎn)型函數(shù)String( )。
1.1.6 Object
簡單來說,對(duì)象即為一組數(shù)據(jù)和功能的集合,關(guān)于對(duì)象的具體內(nèi)容,會(huì)在后續(xù)文章中進(jìn)行闡述
1.2 操作符
1.2.1 一元操作符
- 遞增和遞減操作符
這種操作符又各自分為兩種,前置型和后置型,下面以遞減為例
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; // 等于21
var num4 = num1 + num2; // 等于21
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于22
var num4 = num1 + num2; // 等于21
從上面的代碼中可以看出,前置型操作符使用num-1進(jìn)行運(yùn)算,而后置型操作符則使用num進(jìn)行運(yùn)算。此外,這四個(gè)操作符對(duì)任何值均有效。
- 一元加和減操作符
加操作符對(duì)數(shù)值不會(huì)有任何影響,減操作符主要用于表示負(fù)數(shù),這兩個(gè)操作符應(yīng)用于非數(shù)值類型的值時(shí),其轉(zhuǎn)換規(guī)則與Number( )相同,這里不再贅述。
1.2.2 布爾操作符
布爾操作符一共有三種:非(NOT)、與(AND)、或(OR)
- 邏輯非
| 數(shù)據(jù)類型 | 返回值 |
|---|---|
| 空字符轉(zhuǎn)、數(shù)值0、null、NaN、undefined | true |
| 對(duì)象、非空字符串、非0數(shù)值(包括Infinity) | false |
- 邏輯與
可以應(yīng)用于任何數(shù)據(jù)類型,不一定返回布爾值,具體規(guī)則:
1.若第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù);
2.若第二個(gè)操作數(shù)是對(duì)象,則只有當(dāng)?shù)谝粋€(gè)操作數(shù)返回true的情況下才返回該對(duì)象;
3.若兩個(gè)操作數(shù)都是對(duì)象,則返回第二個(gè)操作數(shù);
4.若第一個(gè)操作數(shù)是nulll,則返回null;
5.若第一個(gè)操作數(shù)是NaN,則返回NaN;
6.若第一個(gè)操作數(shù)是undefined,則返回undefined。
- 邏輯或
可以應(yīng)用于任何數(shù)據(jù)類型,不一定返回布爾值,具體規(guī)則:
1.若第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù);
2.若第一個(gè)操作數(shù)求值為false,則返回第二個(gè)操作數(shù);
3.若兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù);
4.若兩個(gè)操作數(shù)都是null,則返回null;
5.若兩個(gè)操作數(shù)都是NaN,則返回NaN;
6.若兩個(gè)操作數(shù)都是undefined,則返回undefined。
邏輯與與邏輯或都屬于短路操作,即如果第一個(gè)操作數(shù)能決定結(jié)果,那么不會(huì)對(duì)第二個(gè)操作數(shù)求值。
1.2.3 乘性操作符
乘性操作符總共有三種:乘法、除法和求模。這里只列舉一些較為特殊的用法。
乘法:
- 若有一個(gè)操作數(shù)為NaN,則返回NaN;
- 若是Infinity與0相乘,則返回NaN;
- 若是Infinity與非0數(shù)相乘,則返回Infinity或者-Infinity
除法:
- 若是Infinity被Infinity除,則返回NaN;
- 若是0被0除,則返回NaN;
- 若是非零的有限數(shù)被0除,則返回Infinity或者-Infinity
1.2.4 加性操作符
特殊用法:
Infinity + Infinity // Infinity
-Infinity + -Infinity // -Infinity
Infinity + -Infinity // NaN
+0 + +0 // +0
+0 + -0 // +0
-0 + -0 // -0
另外,當(dāng)加性運(yùn)算符遇到字符串時(shí),就會(huì)將其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型,然后進(jìn)行拼接。
"" + 123 + 456 // 123456
1.2.5 關(guān)系操作符
關(guān)系操作符主要有小于(<)、大于(>)、小于等于(<=)、大于等于(>=),這些操作符均返回一個(gè)布爾值。
需要注意:
- 若兩邊均為字符串,則比較兩個(gè)字符串的編碼值;
- 若又一個(gè)操作數(shù)為數(shù)值,則領(lǐng)一個(gè)操作數(shù)轉(zhuǎn)換成數(shù)值再進(jìn)行比較。
var res = "Brick" < "alphabet" // true
var res2 = "23" < "3" // true
還有一個(gè)比較有意思的現(xiàn)象,根據(jù)規(guī)則,NaN與任何值進(jìn)行比較均返回false,所以:
var res1 = NaN < 3 // false
var res2 = NaN >= 3 // false
1.2.6 相等操作符
相等操作符可以分為兩組,一種為相等和不想等(== 和 !=),另一種為全等和不全等(=== 和 !==)。== 和 != 會(huì)先轉(zhuǎn)換數(shù)操作數(shù)(稱為強(qiáng)制轉(zhuǎn)型),然后再比較它們的相等性;而 === 和 !== 則要求相比較的兩個(gè)操作數(shù)類型和值均相等。
下面列舉一些相等操作符的特殊用法:
null == undefined // true
"NaN" == NaN // false
5 == NaN // false
NaN == NaN // false
NaN != NaN // true
false == 0 // true
true == 1 // true
true == 2 // false
undefined == 0 // false
null == 0 // false
"5" == 5 // true
"5" === 5 // false
除以上幾種操作符以外,javascript還提供了條件操作符、賦值操作符、逗號(hào)操作符,由于這幾種操作符較為簡單,這里不進(jìn)行詳細(xì)介紹。