1. 基本語(yǔ)法
1.1 JS 中所有的一切都區(qū)分大小寫(xiě)特姐。
1.2 標(biāo)識(shí)符規(guī)則:
第一個(gè)字符必須是字母晶丘、下劃線_或者一個(gè)美元符號(hào)$。其他字符可以是字母唐含,下劃線浅浮,美元符號(hào)或者數(shù)字。推薦標(biāo)識(shí)符采用駝峰大小寫(xiě)格式觉壶。
1.3 嚴(yán)格模式:
嚴(yán)格模式是為JS定義一種不同的解析和執(zhí)行模型脑题。在嚴(yán)格模式下,ES3中一些不確定的行為將得到處理铜靶,而且對(duì)某些不安全的操作也會(huì)拋出錯(cuò)誤叔遂。
2. 變量var:
用var操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說(shuō)争剿,如果在函數(shù)中使用var定義一個(gè)變量已艰,那么這個(gè)變量在函數(shù)退出后就會(huì)被銷(xiāo)毀(局部變量),如果沒(méi)有這個(gè)var蚕苇,說(shuō)明的變量將會(huì)是全局變量哩掺。
3. 數(shù)據(jù)類(lèi)型
JS中的五種簡(jiǎn)單數(shù)據(jù)類(lèi)型: Undefined, Null, Boolean, Number和String。一種復(fù)雜結(jié)構(gòu)類(lèi)型:Object涩笤。在JS中函數(shù)是一種對(duì)象object嚼吞。
3.1 檢測(cè)給定變量的數(shù)據(jù)類(lèi)型:typeof 操作符
typeof 是一個(gè)操作符,并非是一個(gè)函數(shù)蹬碧。對(duì)于typeof返回的字符串解釋如下
- “undefined”: 未定義
- "boolean": 布爾值
- "string": 字符串
- "number": 數(shù)值
- "object": 對(duì)象或者null
- "function": 函數(shù)
3.2 undefined類(lèi)型
undefined類(lèi)型只有一個(gè)值舱禽,在使用var聲明變量但是未對(duì)其加以初始化的時(shí)候,這個(gè)變量值就是undefined恩沽。注意是聲明變量但是未加以初始化誊稚。
但是:對(duì)于未初始化的變量執(zhí)行typeof操作符會(huì)返回undefined,對(duì)未申明的變量執(zhí)行typeof操作符同樣也會(huì)返回undefined值罗心。
3.3 Null類(lèi)型
Null類(lèi)型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類(lèi)型里伯,這個(gè)特殊值是null。null值表示一個(gè)空對(duì)象指針渤闷,因此typeof null會(huì)得到object疾瓮。
undefined派生自null值,因此null == undefined
返回的是true肤晓。
與變量的undefined類(lèi)型不同爷贫。對(duì)于對(duì)象來(lái)說(shuō)认然,只要意在保存的對(duì)象變量還沒(méi)有真正保存對(duì)象時(shí),就應(yīng)該明確讓該變量保存null值漫萄,這樣做不僅可以體現(xiàn)null作為空對(duì)象的指針的慣例卷员,也有助于區(qū)分null和undefined。
3.3 boolean類(lèi)型
布爾值腾务,兩個(gè)值true
和false
注意是全小寫(xiě)
數(shù)據(jù)類(lèi)型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | "" (空字符串) |
Number | 任何非零數(shù)字值(包括無(wú)窮大) | 0和NaN |
Object | 任何對(duì)象 | null |
undefined | 不適用 | undefined |
有趣的是如果我使用Boolean (undefined)
和 Boolean(null)
得到的會(huì)是false毕骡。但是,如果我們收入undefined==false
和null==false
時(shí)輸出卻為false,原因是在等式轉(zhuǎn)換中: 如果其中一個(gè)值是true岩瘦,則將其轉(zhuǎn)換為1再進(jìn)行比較未巫。如果其中一個(gè)值是false,則將其轉(zhuǎn)換為0再進(jìn)行比較启昧。
3.4 Number 類(lèi)型
Number 類(lèi)型使用IEEE754格式來(lái)表示整數(shù)和浮點(diǎn)數(shù)叙凡。
八進(jìn)制字面值表示:第一位為0,然后是八進(jìn)制數(shù)字序列(0~7).如果字面值中的數(shù)字超出了范圍密末,前導(dǎo)零被忽略握爷,后面的數(shù)值將當(dāng)作十進(jìn)制數(shù)值解析,例子:
var num1 = 070;//八進(jìn)制的56
var num2 = 079;//解析為十進(jìn)制的79
var num3 = 08;// 解析為十進(jìn)制的8
十六進(jìn)制的表示: 前兩位為0x,后面跟任何十六進(jìn)制的數(shù)字(09严里,AF)新啼;A~F不區(qū)分大小寫(xiě),例子:
var num1 = 0xA//十六進(jìn)制的10
var num2 = 0x1f//十六進(jìn)制的31
關(guān)于浮點(diǎn)數(shù)和極值:
- 表示方法:傳統(tǒng)的小數(shù)點(diǎn)和科學(xué)記數(shù)法e
- 對(duì)于類(lèi)似
10.0
和1.
JS會(huì)自動(dòng)轉(zhuǎn)換為整數(shù) - 最高精度:17位
- 計(jì)算時(shí)精度不如整數(shù)
- 最值:
Infinity
NaN
NaN(Not a Number)是一個(gè)特殊的數(shù)值刹碾,用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況燥撞。
兩大特點(diǎn):
- 任何涉及NaN的操作都返回NaN.
- NaN 與任何值都不相等,包括NaN本身迷帜。
isNaN()
函數(shù):判斷參數(shù)是否是NaN,例子:
isNaN(NaN)//true
isNaN(10)//false
isNaN("10")//false,雖然是字符串形式物舒,但是可以被轉(zhuǎn)換成數(shù)值10
isNaN(“blue”)//true
isNaN(true)//false,可以被轉(zhuǎn)換成數(shù)值1
對(duì)于基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的valueof()方法戏锹,然后確定該方法能否可以轉(zhuǎn)為數(shù)值茶鉴。如果不能,再接著調(diào)用toString()方法景用,再測(cè)試返回值。
數(shù)值轉(zhuǎn)換
3個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值: Number(), parseInt(), parseFloat()惭蹂,其中Number()可以用于任何數(shù)據(jù)類(lèi)型伞插,而其他兩個(gè)專(zhuān)門(mén)用于將字符串轉(zhuǎn)換為數(shù)值。
Number()規(guī)則:
- 對(duì)于Boolean值盾碗,true被轉(zhuǎn)化為1媚污,false為0
- null返回為0;
- undefined返回為NaN
- 對(duì)于字符串:
a. 如果字符串中只包含數(shù)字廷雅,則將其轉(zhuǎn)換成十進(jìn)制數(shù)值耗美,011會(huì)變成11京髓,0被自動(dòng)省略
b. 如果字符串包含有效的浮點(diǎn)數(shù)格式,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值
c. 如果字符串中包含有效的16進(jìn)制格式商架,如0xf
堰怨,則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值
d. 空字符串轉(zhuǎn)化為0
e. 如果字符串中包含上述字符串格式以外的字符,返回NaN
f. 如果是對(duì)象蛇摸,會(huì)首先調(diào)用對(duì)象的valueof()方法备图,然后確定該方法能否可以轉(zhuǎn)為數(shù)值。如果不能赶袄,再接著調(diào)用toString()方法揽涮,再依照前面的規(guī)則測(cè)試返回值(與NaN類(lèi)似)。
Number()舉例:
var num1 = Number("Hello world"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11,前導(dǎo)0被忽略饿肺。
var num4 = Number(true); //1
var num5 = Number("hello123") //NaN
var num6 = Number("123hello123") //NaN
Number()函數(shù)在轉(zhuǎn)換字符串的時(shí)候比較復(fù)雜且不合理蒋困,因此處理整數(shù)時(shí)使用的是parseInt()
函數(shù)。該函數(shù)在轉(zhuǎn)換字符串時(shí)敬辣,更多的是看其是否符合數(shù)值模式雪标。他會(huì)忽略字符串前面的空格,直到找到第一個(gè)非空格字符购岗。如果第一個(gè)字符不是數(shù)字或者符號(hào)汰聋,則返回NaN。
注意:這意味著parseInt("")
或者parseInt("hello123")
會(huì)得到NaN喊积。
如果遇到的第一個(gè)字符為數(shù)字字符烹困,會(huì)接著向下解析,直到解析完或者遇到了一個(gè)非數(shù)字字符為止乾吻。與Number()
不同的是髓梅,parseInt()
可以識(shí)別各種整數(shù)形式(十進(jìn)制,八進(jìn)制绎签,十六進(jìn)制)枯饿。
parseInt()舉例
var num1 = parseInt("123456blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(能識(shí)別為十六進(jìn)制數(shù))
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56 (能識(shí)別為八進(jìn)制)
var num6 = parseInt("70"); //70
注意: 上列的070在我的Chrome瀏覽器中顯示為70;原因是ES3和ES5在處理類(lèi)似八進(jìn)制的字符串時(shí)存在分歧(這幫人腦回路真有意思)诡必。ES3 解析為56奢方,ES5解析為70。怎么辦爸舒?向parseInt()
函數(shù)引入第二個(gè)參數(shù)蟋字,明確轉(zhuǎn)換進(jìn)制。
var num1 = parseInt("0xAF", 16); //175
var num2 = parseInt("AF", 16); //175
var num3 = parseInt("AF"); //NaN
var num4 = parseInt("10", 2); //2,按二進(jìn)制解析
var num5 = parseInt("10", 8); //8扭勉, 按八進(jìn)制解析
var num6 = parseInt("10", 10); //10鹊奖,按十進(jìn)制解析
var num7 = parseInt("10", 16); //16, 按十六進(jìn)制解析
與parseInt()
類(lèi)似parseFloat()
解析到第一個(gè)無(wú)效的浮點(diǎn)數(shù)為止涂炎。還有一個(gè)主要區(qū)別是parseFloat()
始終忽略前導(dǎo)0忠聚。parseFloat()只解析十進(jìn)制设哗,因此沒(méi)有像parseInt()指定基數(shù)的用法。
舉例:
var num1 = parseFloat("0xA"); //0
var num2= parseFloat("1234blue"); //1234
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.234.2"); //22.234
var num5 = parseFloat("0908.5"); //908.5
3.5 String
string用于表示由零或多個(gè)16位Unicode字符組成的字符序列两蟀,即字符串网梢。JS中字符串可以是雙引號(hào)可以是單引號(hào),但是開(kāi)頭結(jié)尾需要保持一致垫竞。
轉(zhuǎn)義
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 退格 |
\r | 回車(chē) |
\f | 進(jìn)紙 |
\ | 斜杠 |
' | 單引號(hào) |
" | 雙引號(hào) |
\xnn | 以16進(jìn)制碼nn表示一個(gè)字符 |
\unnnn | 以16進(jìn)制碼nnnn表示的一個(gè)Unicode字符 |
注意:轉(zhuǎn)義序列的長(zhǎng)度為一澎粟,因?yàn)樗褪且粋€(gè)字符。"\u03a3".length = 1
轉(zhuǎn)換為字符串:toString();
null和undefined沒(méi)有toString()方法欢瞪。
通過(guò)傳遞基數(shù)活烙,toString()可以輸出二進(jìn)制,八進(jìn)制遣鼓,十六進(jìn)制等等啸盏。
string()方法
- 如果值有toString()方法,則調(diào)用該方法骑祟。
- 如果值是null回懦,則返回"null"
- 如果值是undefined,則返回"undefined"
另外加號(hào)操作符也可以將某值轉(zhuǎn)換為字符串次企,方法為+"".
Object
對(duì)象即是功能和數(shù)據(jù)的集合怯晕。通過(guò)new操作符后跟要?jiǎng)?chuàng)建的對(duì)象類(lèi)型的名稱(chēng)來(lái)創(chuàng)建。而創(chuàng)建Object類(lèi)型的實(shí)例并且為其添加屬性或者方法缸棵,就可以創(chuàng)建自定義對(duì)象舟茶。如:
` var o = new Object();
每個(gè)Object實(shí)例都有以下屬性和方法:
- constructor: 保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù),對(duì)于前面的例子而言堵第,constructor就是Object()吧凉。這是一個(gè)函數(shù)
- hasOwnProperty(perpertyName): 用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(并非在原型中)是否存在。其中作為參數(shù)的屬性名需要時(shí)字符串格式踏志。如:
o.hasOwnProperty('name')
. - isPrototypeod(object): 用于檢查傳入對(duì)象是否是當(dāng)前對(duì)象的原型阀捅。
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語(yǔ)句來(lái)枚舉。與hasOwnProperty(perpertyName)一致作為參數(shù)的屬性名需要時(shí)字符串格式针余。
- toLocalString():返回對(duì)象的字符串表示饲鄙,該字符串與執(zhí)行的環(huán)境的地區(qū)對(duì)應(yīng)
- toString(): 返回對(duì)象的字符串表示
- valueOf(): 返回對(duì)象的字符串,數(shù)值或者布爾表示圆雁,通常與toString()的返回值相同傍妒。