一采郎、語法
1.1 區(qū)分大小寫
在JS
中一切(變量、函數(shù)名和操作符)都是區(qū)分大小寫的狂魔。
1.2 標(biāo)識符
標(biāo)識符可以是按照下列格式規(guī)則組合起來的一個(gè)或多個(gè)字符:
- 第一個(gè)字符必須是一個(gè)字母蒜埋、下劃線或一個(gè)美元符號
- 其他字符可以是字母、下劃線最楷、美元符號或數(shù)字整份。
二待错、變量
定義變量時(shí)要使用var
操作符:
var message;
這里定義了一個(gè)變量,該變量可以保存任何值(像這樣未經(jīng)過初始化的變量烈评,會(huì)保存一個(gè)特殊的值——undefined
)火俄,在定義的時(shí)候如果不使用var
操作符,那么定義的新變量將是全局變量讲冠。
三瓜客、數(shù)據(jù)類型
在ECMAScript
中有五種簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Null竿开、Boolean谱仪、Number
和String
。還有一種復(fù)雜的數(shù)據(jù)類型——Object
否彩,其本質(zhì)上是由一組無序的名值對組成的疯攒。
3.1 typeof操作符
這里typeof
是用于檢測數(shù)據(jù)類型,對一個(gè)值使用typeof
操作符可能返回下列某個(gè)字符串:
- “
undefined
”——如果這個(gè)值未定義 - “
boolean
”——如果這個(gè)值是布爾值 - “
string
”——如果這個(gè)值是字符串 - “
number
”——如果這個(gè)值是數(shù)值 - “
object
”——如果這個(gè)值是對象或null
- “
function
”——如果這個(gè)值是函數(shù)
3.2 Undefined類型
Undefined
類型只有一個(gè)值列荔,即特殊的 undefined
敬尺,使用var
聲明變量但未對其加以初始化時(shí),這個(gè)變量的值就是undefined
肌毅。
包含undefined
值的變量與尚未定義的變量是不一樣的:
var message;
//下面這個(gè)變量并沒有聲明
//var age;
console.log(message);//undefined
console.log(age);//產(chǎn)生錯(cuò)誤
注意:對未初始化的變量執(zhí)行typeof
操作符會(huì)返回undefined
值筷转,而對未聲明的變量執(zhí)行typeof
操作符同樣會(huì)返回undefined
值。
3.3 Null類型
Null
類型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型悬而,這個(gè)特殊的值就是null
呜舒。使用typeof
操作符檢測null
會(huì)返回“object
”。如果定義的變量準(zhǔn)備在將來用于保存對象笨奠,那么最好將該變量初始化為null
袭蝗,而不是其他值。這樣般婆,只要檢查null
值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對象的引用到腥。
if(car != null){
//對car對象執(zhí)行某些操作
}
實(shí)際上,undefined
值是派生自null
值的蔚袍,所以它們是相等的:
alert(null == undefined);//true
3.4 Boolean類型
該類型有兩個(gè)字面值:true
和false
(不等同于1乡范、0
)。雖然此類型的字面值只有兩個(gè)啤咽,但ECMAScript
中所有類型的值都有與這兩個(gè)值等價(jià)的值晋辆,要將一個(gè)值轉(zhuǎn)換為其對應(yīng)的Boolean
值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean()
:
var message = "Hello";
var messageAsBoolean = Boolean(message);
下表給出了各種數(shù)據(jù)類型及其對應(yīng)的轉(zhuǎn)換規(guī)則:
數(shù)據(jù)類型 | 轉(zhuǎn)換為true 的值 |
轉(zhuǎn)換為false 的值 |
---|---|---|
Boolean |
true |
false |
String |
任何非空字符串 |
"" (空字符串) |
Number |
任何非零數(shù)字值 |
0 和NaN
|
Object |
任何對象 | null |
Undefined |
不適用 | undefined |
這些轉(zhuǎn)換規(guī)則對理解流控制語句(如if
語句)自動(dòng)執(zhí)行相應(yīng)的Boolean
轉(zhuǎn)換非常重要:
var message = "Hello";
if(message){//自動(dòng)轉(zhuǎn)型
alert("Value if true");
}
3.5 Number類型
var intNum = 10;//整數(shù)
var octalNum1 = 070;//八進(jìn)制的56
var octalNum2 = 079;//無效八進(jìn)制——解析為79
var octalNum3 = 08;//無效八進(jìn)制——解析為8
var hexNum1 = 0xA;//十六進(jìn)制的10
var hexNum2 = 0x1f;//十六進(jìn)制的31
3.5.1浮點(diǎn)值
所謂浮點(diǎn)值宇整,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn)瓶佳,并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。雖然小數(shù)點(diǎn)前面可以沒有整數(shù)鳞青,但不推薦這種寫法霸饲。
var floatNum1 = 1.1;
var floatNum2 = 01;
var floatNum3 = .1;//不推薦
由于保存浮點(diǎn)值需要的內(nèi)存空間是保存整數(shù)值的兩倍为朋,因此ECMAScript
會(huì)不失時(shí)機(jī)地將浮點(diǎn)值轉(zhuǎn)換為整數(shù)值:
var floatNum1 = 1.;//小數(shù)點(diǎn)后面沒有數(shù)字——解析為1
var floatNum2 = 10.0;//整數(shù)——解析為10
浮點(diǎn)值的最高精度是17
位小數(shù),但在進(jìn)行算術(shù)時(shí)其精度遠(yuǎn)遠(yuǎn)不如整數(shù)厚脉,如0.1
加0.2
的結(jié)果不是0.3
习寸,而是0.30000000004
。
if(a + b == 0.3){
//不要這樣做
}
3.5.2 數(shù)值范圍
由于內(nèi)存限制器仗,ECMAScript
能夠表示的最小數(shù)值保存在Number.MIN_VALUE
中融涣,能表示的最大值保存在Number.MAX_VALUE
中。如果某次計(jì)算的結(jié)果得到了一個(gè)超出JS
數(shù)值范圍的值精钮,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)成特殊的Infinity
值威鹿。具體來說,如果這個(gè)數(shù)值是負(fù)數(shù)轨香,則會(huì)被轉(zhuǎn)換成-Infinity
(負(fù)無窮)忽你,否則將被轉(zhuǎn)換成Infinity
(正無窮)。
如果某個(gè)值是Infinity
(正或負(fù))臂容,那么該值將無法繼續(xù)參與下一次計(jì)算科雳。可以使用isFinite()
函數(shù)來判斷某個(gè)值是否是有窮的(如果是有窮則返回true
)脓杉。訪問Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
也可以得到負(fù)和正Infinity
的值糟秘。
3.5.3 NaN
這個(gè)值是一個(gè)非數(shù)值,是一個(gè)特殊的數(shù)值球散,這個(gè)數(shù)值用于一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況尿赚。零除以零返回
NaN
,整數(shù)除以零返回Infinity
蕉堰,負(fù)數(shù)除以零返回-Infinity
凌净。NaN
本身有兩個(gè)特點(diǎn):首先,任何涉及NaN
的操作都會(huì)返回NaN
屋讶,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問題冰寻。其次,NaN
與任何值都不相等皿渗,包括NaN
本身斩芭。這里可以使用isNaN()
函數(shù)幫助我們確定這個(gè)參數(shù)是否“不是數(shù)值”。此函數(shù)在接收到一個(gè)數(shù)值之后乐疆,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值划乖。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值,如字符串或布爾值诀拭。而任何不能被轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true
迁筛。
alert(isNaN(NaN));//true
alert(isNaN(10));//false(10是一個(gè)數(shù)值)
alert(isNaN("10"));//false(可以被轉(zhuǎn)換成10)
alert(isNaN("blue"));//true(不能轉(zhuǎn)換成數(shù)值)
alert(isNaN(true));//false(可以被轉(zhuǎn)換成1)
alert(isNaN(false));//false(可以被轉(zhuǎn)換成0)
說明:此方法確實(shí)也適用于對象煤蚌,在后面進(jìn)行說明耕挨。
3.5.4 數(shù)值轉(zhuǎn)換
有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()细卧、parseInt()、parseFloat()
筒占。第一個(gè)函數(shù)贪庙,即轉(zhuǎn)型函數(shù)Number()
可以用于任何數(shù)據(jù)類型,而另兩個(gè)函數(shù)則專門用于把字符串轉(zhuǎn)換成數(shù)值翰苫。三個(gè)函數(shù)對于同樣的輸入會(huì)有不同的結(jié)果止邮。
1、Number()
函數(shù)的轉(zhuǎn)換規(guī)則
- 如果是
Boolean
值奏窑,true
和false
分別被轉(zhuǎn)換為1
和0
- 如果是數(shù)字值导披,只是簡單的傳入和返回
- 如果是
null
值,返回0
- 如果是
undefined
埃唯,返回NaN
- 如果是字符串撩匕,遵循下列規(guī)則
- 如果字符串中只包含數(shù)字(包括帶正號或負(fù)號的情況),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值墨叛。如
“123”
轉(zhuǎn)換為123
止毕,“011”
轉(zhuǎn)換為11
(前導(dǎo)零被忽略) - 如果字符串中包含有效的浮點(diǎn)格式,如
“1.1”
漠趁,則將其轉(zhuǎn)換為對應(yīng)的浮點(diǎn)值(也會(huì)忽略前導(dǎo)零) - 如果字符串中包含有效的十六進(jìn)制格式扁凛,如
“0xf”
,則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值 - 如果字符串是空的(不包含任何字符)闯传,則將其轉(zhuǎn)換為零
- 如果字符串中包含除上述格式之外的字符谨朝,轉(zhuǎn)換為
NaN
- 如果字符串中只包含數(shù)字(包括帶正號或負(fù)號的情況),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值墨叛。如
- 如果是對象,則調(diào)用對象的
valueOf()
方法丸边,然后依照前面的規(guī)則轉(zhuǎn)換返回的值叠必。如果轉(zhuǎn)換的結(jié)果是NaN
,則調(diào)用對象的toString()
妹窖,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值纬朝。
2、parseInt()
函數(shù)的轉(zhuǎn)換規(guī)則
由于Number()
函數(shù)在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理骄呼,因此在處理整數(shù)的時(shí)候更常用的是parseInt()
函數(shù)共苛。此函數(shù)在處理字符串時(shí),會(huì)忽略字符串前面的空格蜓萄,直至找到一個(gè)非空字符隅茎。如果第一個(gè)字符不是數(shù)字字符或負(fù)號,此函數(shù)會(huì)返回NaN
嫉沽。也就是說辟犀,此函數(shù)轉(zhuǎn)換空字符串會(huì)返回NaN
(Number()
對空字符返回零)。如果第一個(gè)字符是數(shù)字字符绸硕,此函數(shù)會(huì)繼續(xù)解析第二個(gè)字符堂竟,直到解析完所有的后續(xù)字符或者遇到了一個(gè)非數(shù)字字符魂毁。如“123blue”
會(huì)被轉(zhuǎn)換為123
,“22.5”出嘹、“22.1”
都會(huì)被轉(zhuǎn)換為22
席楚。如果字符串中第一個(gè)字符是數(shù)字字符,此函數(shù)能夠是被出各種整數(shù)的格式税稼。
var num1 = parseInt("123blue");//123
var num2 = parseInt("");//NaN
var num3 = parseInt("0xA");//10
var num4 = parseInt("22.5");//22
var num5 = parseInt("070");//56
var num6 = parseInt("70");//70
說明:在ECMAScript 5
和3
中此函數(shù)對八進(jìn)制的解析存在分歧:
var num7 = parseInt("070");//ECMAScript 3認(rèn)為是56帐要,ECMAScript 5認(rèn)為是70
也就是說坛悉,ECMAScript 5
中坪创,此函數(shù)已經(jīng)不具有解析八進(jìn)制的能力瞎嬉。針對這種情況,我們推薦指定基數(shù)扰肌,即指定使用哪種格式(進(jìn)制)解析:
var num1 = parseInt("AF", 16);//175
var num2 = parseInt("AF");//NaN
3铆农、parseFloat()
函數(shù)的解析規(guī)則
與parseInt()
函數(shù)類似,此函數(shù)也是從第一個(gè)字符開始解析每個(gè)字符狡耻。也是一直解析到字符串末尾墩剖,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止。字符串中的第一個(gè)小數(shù)點(diǎn)是有效的夷狰,而后面多余的小數(shù)點(diǎn)就是無效的了岭皂,于是,后面的字符串將被忽略沼头。如“22.5.6”
將被轉(zhuǎn)換為22.5
爷绘。除了第一個(gè)小數(shù)點(diǎn)有效之外,此函數(shù)與parseInt()
的第二個(gè)區(qū)別在于它始終都會(huì)忽略前導(dǎo)的零进倍。此函數(shù)可以識別前面討論過的所有的浮點(diǎn)數(shù)值格式土至,也包括十進(jìn)制整數(shù)格式。但十六進(jìn)制格式的字符串則始終會(huì)被轉(zhuǎn)換為零猾昆。由于此函數(shù)值解析十進(jìn)制值陶因,因此它沒有第二個(gè)參數(shù)用來指定基數(shù)的用法。如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù)(沒有小數(shù)點(diǎn)垂蜗,或者小數(shù)點(diǎn)后都是零)楷扬,此函數(shù)會(huì)返回整數(shù)。
var num1 = parseFloat("123blue");//123
var num2 = parseFloat("0xA");//0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.5.3");//22.5
var num5 = parseFloat("0908.5");//908.5
var num6 = parseFloat("3.125e7");//31250000
3.6 String類型
字符串可以由雙引號或單引號表示贴见,但是左右引號必須匹配烘苹。
3.6.1 字符字面量
String
數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列片部,用于表示非打印字符镣衡,或者具有其他用途的字符。
字面量 | 含義 |
---|---|
\n |
換行 |
\t |
制表 |
\b |
空格 |
\r |
回車 |
\f |
進(jìn)紙 |
\\ \\ |
斜杠 |
\' |
單引號 |
\" |
雙引號 |
\xnn |
以十六進(jìn)制代碼nn 表示的一個(gè)字符(其中n 為0~F )。例如\x41 表示“A”
|
\unnnn |
以十六進(jìn)制代碼nnnn 表示的一個(gè)Unicode 字符(其中n 為0~F )廊鸥。如\u03a3 表示希臘字符Σ
|
這些字面量可以出現(xiàn)在字符串中的任意位置然爆,而且被當(dāng)作一個(gè)字符來解析。
3.6.2 字符串的特點(diǎn)
在ECMAScript
中黍图,字符串是不可變的,即字符串一旦創(chuàng)建奴烙,它們的值就不能改變助被。要改變某個(gè)變量保存的字符串,首先要銷毀原來的字符串切诀,然后用另一個(gè)包含新值的字符串填充該變量揩环。
var lang = "Java";
lang = lang + "Script";
說明:上述代碼的執(zhí)行過程是,首先創(chuàng)建一個(gè)能容納十個(gè)字符的新字符串幅虑,然后在這個(gè)字符串中填充“Java”
和“Script”
丰滑,最后異步是銷毀原來的字符串“Java”
和“Script”
,因?yàn)檫@兩個(gè)字符串已經(jīng)沒用了倒庵,這個(gè)過程是在后臺發(fā)生的褒墨,這也是舊版本瀏覽器中拼接字符串很慢的原因,現(xiàn)在已經(jīng)解決了擎宝。
3.6.3 轉(zhuǎn)換為字符串
要把一個(gè)值轉(zhuǎn)換為一個(gè)字符串有兩種方式郁妈。第一種是使用幾乎每個(gè)值都有的toString()
方法。
var age = 11;
var ageAsString = age.toString();//"11"
var found = true;
var foundAsString = found.toString();//"true"
數(shù)值绍申、布爾值噩咪、對象和字符串值(字符串使用此方法返回其本身的一個(gè)副本)都有toString()
。但null
和undefined
值沒有這個(gè)方法极阅。在多數(shù)情況下胃碾,調(diào)用此方法不用傳遞參數(shù),但是在將數(shù)字轉(zhuǎn)換為字符串時(shí)筋搏,可以傳入相關(guān)的基數(shù)仆百,而輸出的字符串可以是某個(gè)值的八進(jìn)制、十進(jìn)制(默認(rèn))奔脐、十六進(jìn)制表示儒旬。
在不知道要轉(zhuǎn)換的值是不是null
或undefined
的情況下,還可以使用轉(zhuǎn)型函數(shù)String()
帖族,這個(gè)函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串栈源,轉(zhuǎn)換規(guī)則如下:
- 如果值有
toString()
方法,則調(diào)用該方法并返回相應(yīng)的結(jié)果 - 如果值是
null
竖般,則返回“null”
- 如果值是
undefined
甚垦,則返回“undefined”
3.7 Object類型
在ECMAScript
中,Object
類型是所有它的實(shí)例的基礎(chǔ)。Object
的每個(gè)實(shí)例都有下列屬性和方法:
-
constructor
:保存用于創(chuàng)建當(dāng)前對象的函數(shù)艰亮。 -
hasOwnProperty(protoName)
:用于檢查給定的屬性在當(dāng)前對象中(而不是在原型中)是否存在闭翩,其中參數(shù)必須以字符串形式指定。 -
isPrototypeOf(object)
:用于檢查傳入的對象是否是傳入對象的原型迄埃。 -
propertyIsEnumerable(propertyName)
:用于檢查給定的屬性是否能夠使用for-in
語句來枚舉疗韵。參數(shù)也必須以字符串形式指定。 -
toLocaleString()
:返回對象的字符串表示侄非,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng) -
valueOf()
:返回對象的字符串蕉汪、數(shù)值或布爾值表示。通常與toString()
方法的返回值相同逞怨。