1.1 數(shù)據(jù)類型
JavaScript的基本數(shù)據(jù)類型有undefined瓣戚、null端圈、boolean、number子库、string以及一種較為復雜的數(shù)據(jù)類型object舱权。
由于JS的數(shù)據(jù)類型是松散類型的,因此需要使用typeof操作符對數(shù)據(jù)類型進行檢測仑嗅,這里著重提一下:
typeof null // "object"
typeof function // "function"
函數(shù)盡管不是一種數(shù)據(jù) 類型宴倍,但由于其特殊的屬性,有必要與其他數(shù)據(jù)類型進行區(qū)分仓技。
1.1.1 Undefined
在變量聲明但未定義時鸵贬,內(nèi)部會自動為其賦值為undefined。不過脖捻,包含undefined值的變量與未聲明的變量之間仍然存在一些差別阔逼,我們來看下面兩段代碼:
var message // 該變量聲明后默認為undefined
// age 為未聲明的變量
alert( message ) // "undefined"
alert( age ) // 發(fā)生錯誤
var message // 該變量聲明后默認為undefined
// age 為未聲明的變量
typeof message // "undefined"
typeof age // "undefined"
雖然在alert中age會產(chǎn)生錯誤,但在typeof中未聲明的age也會返回undefined值地沮,這是比較奇怪的現(xiàn)象嗜浮!同時,typeof是唯一地能對未聲明變量進行的操作摩疑。
1.1.2 Null
null值表示一個空對象的指針危融,undefined實際上派生自null值,在JS的相等性測試中未荒,兩者是相等的专挪,注意這里的相等(==)與全等(===)不同。
null == undefined // true
1.1.3 Boolean
Boolean類型分為兩種片排,即true和false寨腔,這里要注意大小寫,Boolean是對大小寫敏感的率寡。
在不同數(shù)據(jù)類型中迫卢,Boolean類型有不同的表現(xiàn)形式,具體見下表冶共。
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | " " ( 空字符串 ) |
Number | 非零數(shù)字和無窮大 | 0或NaN |
Object | 任何對象 | null |
Undefined | n/a | undefined |
上表中Undefined一行中乾蛤,n/a是not applicable的縮寫每界,意為 “ 不適用 ”
1.1.4 Number
Number類型使用IEEE754格式來表示整數(shù)和浮點數(shù)。浮點數(shù)的最高精度是17位小數(shù)家卖,但在進行計算時它的精度遠遠不如整數(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叁征,超過這兩個值即為Infinity和-Infinity。
該類型中有一個特殊的數(shù)值逛薇,即NaN(Not a Number)捺疼,該值是為了防止在數(shù)值計算中返回非數(shù)值的情況,其本身有兩個特點永罚。
- 涉及NaN的操作均會返回NaN啤呼;
- NaN與任何值都不想等,包括它自己尤蛮。
數(shù)值轉(zhuǎn)換:Number ( )媳友、parserInt ( )斯议、parserFloat ( )之間的比較产捞。Number ( )可以接受任何數(shù)據(jù)類型,而parserInt ( )哼御、parserFloat ( )只能接受字符串類型
- ** Number ( ) **
- true => 1
- false 或 null => 0
- undefined => NaN
- string => 若為數(shù)字(包括二進制坯临、十進制、八進制恋昼、十六進制和浮點數(shù))看靠,均轉(zhuǎn)換成十進制對應的數(shù)字;若為空字符串(" ")液肌,轉(zhuǎn)換為0挟炬;其他情況,均轉(zhuǎn)換為NaN
- object => 先調(diào)用valueOf( )方法嗦哆,依次按照之前的規(guī)則進行轉(zhuǎn)換谤祖,若返回為NaN,則調(diào)用toString( )方法老速,再依次按照前面的規(guī)則進行轉(zhuǎn)換
-
parserInt ( ) 和 parserFloat ( )
parserInt ( )從第一個不為空格的數(shù)字字符開始檢測粥喜,直到檢測到非數(shù)字字符為止,它可以解析不同進制的數(shù)值橘券,并返回對應十進制的值额湘,通過傳入第二個參數(shù)卿吐,即進制值來實現(xiàn);相比之下锋华,parserFloat ( )只能解析十進制的浮點數(shù)嗡官,且能解析第一個小數(shù)點,遇到第二個小數(shù)點會自動忽略毯焕。
下面是一些常見的例子:
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類型用于表示由零個或多個16位字符組成的Unicode字符組成的字符序列谨湘,即字符串〗嫔ィ可以用(")或者(')紧阔,但兩邊的引號類型要相等。字符串帶有length屬性续担,用于表示字符串的長度擅耽。
要想將別的數(shù)據(jù)類型如數(shù)值、布爾值物遇、對象和字符串轉(zhuǎn)換為字符串類型乖仇,可以使用toString( )方法,不過null和undefined值沒有這個方法询兴,需要使用轉(zhuǎn)型函數(shù)String( )乃沙。
1.1.6 Object
簡單來說,對象即為一組數(shù)據(jù)和功能的集合诗舰,關于對象的具體內(nèi)容警儒,會在后續(xù)文章中進行闡述
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進行運算,而后置型操作符則使用num進行運算属百。此外记劝,這四個操作符對任何值均有效。
- 一元加和減操作符
加操作符對數(shù)值不會有任何影響族扰,減操作符主要用于表示負數(shù)厌丑,這兩個操作符應用于非數(shù)值類型的值時,其轉(zhuǎn)換規(guī)則與Number( )相同渔呵,這里不再贅述怒竿。
1.2.2 布爾操作符
布爾操作符一共有三種:非(NOT)、與(AND)厘肮、或(OR)
- 邏輯非
數(shù)據(jù)類型 | 返回值 |
---|---|
空字符轉(zhuǎn)愧口、數(shù)值0、null类茂、NaN耍属、undefined | true |
對象托嚣、非空字符串、非0數(shù)值(包括Infinity) | false |
- 邏輯與
可以應用于任何數(shù)據(jù)類型厚骗,不一定返回布爾值示启,具體規(guī)則:
1.若第一個操作數(shù)是對象,則返回第二個操作數(shù)领舰;
2.若第二個操作數(shù)是對象夫嗓,則只有當?shù)谝粋€操作數(shù)返回true的情況下才返回該對象;
3.若兩個操作數(shù)都是對象冲秽,則返回第二個操作數(shù)舍咖;
4.若第一個操作數(shù)是nulll,則返回null锉桑;
5.若第一個操作數(shù)是NaN排霉,則返回NaN;
6.若第一個操作數(shù)是undefined民轴,則返回undefined攻柠。
- 邏輯或
可以應用于任何數(shù)據(jù)類型,不一定返回布爾值后裸,具體規(guī)則:
1.若第一個操作數(shù)是對象瑰钮,則返回第一個操作數(shù);
2.若第一個操作數(shù)求值為false微驶,則返回第二個操作數(shù)浪谴;
3.若兩個操作數(shù)都是對象,則返回第一個操作數(shù)祈搜;
4.若兩個操作數(shù)都是null较店,則返回null;
5.若兩個操作數(shù)都是NaN容燕,則返回NaN;
6.若兩個操作數(shù)都是undefined婚度,則返回undefined蘸秘。
邏輯與與邏輯或都屬于短路操作,即如果第一個操作數(shù)能決定結(jié)果蝗茁,那么不會對第二個操作數(shù)求值醋虏。
1.2.3 乘性操作符
乘性操作符總共有三種:乘法、除法和求模哮翘。這里只列舉一些較為特殊的用法颈嚼。
乘法:
- 若有一個操作數(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
另外,當加性運算符遇到字符串時旺上,就會將其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型瓶蚂,然后進行拼接。
"" + 123 + 456 // 123456
1.2.5 關系操作符
關系操作符主要有小于(<)宣吱、大于(>)扬跋、小于等于(<=)、大于等于(>=)凌节,這些操作符均返回一個布爾值钦听。
需要注意:
- 若兩邊均為字符串,則比較兩個字符串的編碼值倍奢;
- 若又一個操作數(shù)為數(shù)值朴上,則領一個操作數(shù)轉(zhuǎn)換成數(shù)值再進行比較。
var res = "Brick" < "alphabet" // true
var res2 = "23" < "3" // true
還有一個比較有意思的現(xiàn)象卒煞,根據(jù)規(guī)則痪宰,NaN與任何值進行比較均返回false,所以:
var res1 = NaN < 3 // false
var res2 = NaN >= 3 // false
1.2.6 相等操作符
相等操作符可以分為兩組畔裕,一種為相等和不想等(== 和 !=)衣撬,另一種為全等和不全等(=== 和 !==)。== 和 != 會先轉(zhuǎn)換數(shù)操作數(shù)(稱為強制轉(zhuǎn)型)扮饶,然后再比較它們的相等性具练;而 === 和 !== 則要求相比較的兩個操作數(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還提供了條件操作符扛点、賦值操作符、逗號操作符岂丘,由于這幾種操作符較為簡單陵究,這里不進行詳細介紹。