一個完整的JavaScript實現(xiàn)包含以下三個部分:
- ECMAScript
- DOM(文檔對象模型)
- BOM(瀏覽器對象模型)
變量聲明
定義
- JavaScript的變量名可以使用_,數(shù)字惹盼,字母吃型,$組成碗短,不能以數(shù)字開頭;
- 定義變量時使用var操作符
注意:
- 變量名區(qū)分大小寫蓄诽;
- 推薦使用駝峰式命名規(guī)則碍侦;
- 保留字不能做變量名。
數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined
痕慢、Null
、Boolean
涌矢、Number
掖举、String
,還有一個復(fù)雜數(shù)據(jù)類型:Object
Null和Undefined
null
和 undefined
都可以表示“沒有”蒿辙,將變量賦值 undefined
或 null
拇泛,語法上幾乎沒有區(qū)別
var a = undefined
var a = null
將 a
分別賦值時,效果幾乎等價思灌,在 if
語句中會被自動轉(zhuǎn)為 false
if (!undefined) {
console.log('undefined is false')
}
// undefined is false
if (!null) {
console.log('null is false')
}
// null is false
undefined == null
// true
兩者的區(qū)別是:null
是一個表示“空”的對象俺叭,轉(zhuǎn)為數(shù)值時為0
;undefined
是一個表示“此處無定義”的原始值泰偿,轉(zhuǎn)為數(shù)值時為NaN
Boolean
布爾值表示“真”熄守、“假”兩種狀態(tài),“真”用true
表示耗跛,“假”用false
表示裕照。
要將一個值轉(zhuǎn)換為其對應(yīng)的Boolean
值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean()
:
var a = "Hello World"
var b = Boolean(a) // true
以下為各數(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 | n/a | undefined |
下列運(yùn)算符也可返回布爾值:
- 前置邏輯運(yùn)算符:
!
- 相等運(yùn)算符:
===
==
!==
!=
- 比較運(yùn)算符:
>
<
>=
<=
Number
JavaScript 對整數(shù)提供四種進(jìn)制的表示方法:
0xff // 255
0o377 // 255
0b11 // 3
- 十進(jìn)制:沒有前導(dǎo)0的數(shù)值
- 八進(jìn)制:有前綴
0o
或0O
的數(shù)值调塌,或者有前導(dǎo)0晋南、且只用到了0-7的八個阿拉伯?dāng)?shù)字的數(shù)值 - 十六進(jìn)制:有前綴
0x
或0X
的數(shù)值 - 二進(jìn)制:有前綴
0b
或0B
的數(shù)值
浮點數(shù)的最高精度是17位小數(shù),但在進(jìn)行算術(shù)計算時其精度度遠(yuǎn)遠(yuǎn)不如整數(shù)羔砾。例如:0.1加0.2的結(jié)果不是0.3负间,而是0.30000000000000004偶妖,涉及小數(shù)的比較和運(yùn)算需要小心。
數(shù)值范圍:ECMAScript能夠表示的最小數(shù)值保存在 Number.MIN_VALUE 中——在大多數(shù)瀏覽器中政溃,這個值是5e-324趾访,最大值存在 Number.MAX_VALUE 中——在大多數(shù)瀏覽器中,這個值是1.7976931348623157e+308董虱。除了出現(xiàn)了超出JavaScript數(shù)值范圍的值扼鞋,這個值會自動轉(zhuǎn)換成特殊的 Infinity 值。
NaN是JavaScript的特殊值愤诱,表示“非數(shù)字”(Not a Number)云头,用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。例如:任何數(shù)值除以0會返回NaN转锈。
NaN具有的兩個特點:
- 任何涉及 NaN 的操作都會返回 NaN盘寡;
- NaN 與任何值都不相等楚殿,包括 NaN 本身撮慨。
針對這兩個特點,ECMAScript 定義了 isNaN() 函數(shù)脆粥,可判斷是否不是數(shù)值砌溺。
與數(shù)值相關(guān)的全局方法:parseInt() 和 parseFloat()
parseInt()
將字符串轉(zhuǎn)為整數(shù),第一個參數(shù)為要轉(zhuǎn)換的值变隔,第二個參數(shù)表示被解析的值的進(jìn)制(在2-36之間):
parseInt('123') // 123
parseInt(' 12') // 12
parseInt('1.23') // 1
parseInt('12**') // 12
parseInt('12e2') // 12
parseInt('abc') // NaN
parseInt('+1') // 1
parseInt('0x10') // 16
parseInt('1000', 2) // 8
parseInt('1000', 6) // 256
parseInt('1000', 8) // 512
parseFloat()
將字符串轉(zhuǎn)換為浮點數(shù):
parseFloat('3.14') // 3.14
parseFloat('314e-2) // 3.14
parseFloat('3.14more') // 3.14
parseFloat('\t\r3.14\n') // 3.14
parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN
parseFloat()
會將空字符串轉(zhuǎn)為NaN
String
字符串是由零或多個16位Unicode字符組成的字符序列规伐,可用雙引號("")或單引號('')表示。
轉(zhuǎn)義:反斜杠(\)在字符串中可表示一些特殊字符匣缘,又稱轉(zhuǎn)義符:
- \0 :null(\u0000)
- \b :后退鍵(\u0008)
- \f :換頁符(\u000C)
- \n :換行符(\u000A)
- \r :回車鍵(\u000D)
- \t :制表符(\u0009)
- \v :垂直制表符(\u000B)
- ' :單引號(\u0027)
- " :雙引號(\u0022)
- \ :反斜杠(\u005C)
將值轉(zhuǎn)換為字符串的兩種方式:幾乎每個值都有的toString()
方法和String()
轉(zhuǎn)型函數(shù)猖闪。
var a = 11
var b = a.toString() // "11"
var c = true
var d = c.toString() // "true"
但 null
undefined
沒有toString()
(),因此肌厨,在未確定需要轉(zhuǎn)換的值是不是null
或undefined
的情況下培慌,可以用String()
方法。其轉(zhuǎn)換規(guī)則為:
- 如果值有
toString()
方法柑爸,則調(diào)用該方法吵护; - 如果值是
null
,則返回"null"
- 如果值是
undefined
表鳍,則返回"undefined"
Object
ECMAScript 中的對象是一組數(shù)據(jù)和功能的集合馅而,對象可通過執(zhí)行 new 操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。如:
var o = new Object()
Object 的每個實例都具有下列的屬性和方法:
- Constructor:保存用于創(chuàng)建當(dāng)前對象的函數(shù)譬圣;
- hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對象實例中(而不是在實例的原型中)是否存在瓮恭。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定厘熟;
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用
for-in
語句來枚舉屯蹦; - toLocaleString():返回對象的字符串表示诸衔,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng);
- toString():返回對象的字符串表示颇玷;
- valueOf():返回對象的字符串笨农、數(shù)值或布爾值表示。通常與
toString()
方法的返回值相同帖渠。
typeof操作符——用來檢測給定變量的數(shù)據(jù)類型
對給定值使用typeof操作符可能返回下列字符串:
- "undefined"——如果該值未定義
- "boolean"——如果該值為布爾值
- "string"——如果該值是字符串
- "number"——如果該值是數(shù)值
- "object"——如果該值是對象或null
- "function"——如果該值是函數(shù)
操作符
一元操作符:只能操作一個值的操作符
-
遞增(++)和遞減(--)操作符
前置操作符會先對值進(jìn)行操作谒亦;后置操作符會先取值再進(jìn)行操作:
var a = 1 var b = ++a +3 // 5 var c = 1 var d = c-- +3 // 4
-
位操作符
按位非(NOT)
按位非操作符由一個波浪線(~)表示,返回數(shù)值的反碼空郊。按位與(AND)
按位與操作符由一個和字符號(&)表示份招,將每個數(shù)值的每一位對齊,進(jìn)行 AND 操作狞甚。按位或(OR)
按位與操作符由一個豎線符合(|)表示锁摔。按位異或(XOR)
按位異或操作符由一個插入符號(^)表示。
布爾操作符
邏輯非
由一個嘆號(!)表示哼审,邏輯非會先將操作數(shù)轉(zhuǎn)換為一個布爾值谐腰,然后求反。邏輯與
由兩個和號(&&)組成涩盾,有兩個操作數(shù)十气,當(dāng)且僅當(dāng)兩個操作數(shù)均為true
時返回true
。邏輯或
由兩個豎線(||)表示春霍,有兩個操作數(shù)砸西,當(dāng)且僅當(dāng)兩個操作數(shù)均為false
時返回false
。
語句
if 語句
if (condition) {
statement1
} else {
statement2
}
condition 可以是任意表達(dá)式址儒,且會自動調(diào)用 Boolean() 轉(zhuǎn)換表達(dá)式的結(jié)果為一個布爾值芹枷。
do-while 語句
do-while 語句是一種后測試循環(huán)語句,即先執(zhí)行循環(huán)體中的代碼莲趣,再測試出口條件鸳慈。
do {
statement
} while (expression)
while 語句
while 語句屬于前測試循環(huán)語句,先判斷出口條件是否滿足妖爷,再執(zhí)行循環(huán)體代碼蝶涩。
while (expression) {
statement
}
for 語句
for (initialization; expression; post-loop-expression) {
statement
}
for-in 語句
for-in 語句是一種精準(zhǔn)的迭代語句,可用來枚舉對象的屬性
for (property in expression) {
statement
}
label 語句
使用 label 語句可以在代碼中添加標(biāo)簽
label: statement
break 和 continue 語句
break 和 continue 語句用于在循環(huán)體中精確控制代碼的執(zhí)行絮识。break 語句會立即退出循環(huán)绿聘,執(zhí)行循環(huán)體外的代碼;continue 語句則是退出當(dāng)前循環(huán)次舌,繼續(xù)執(zhí)行下一次循環(huán)熄攘。
with 語句
with 語句的作用是將代碼的作用域設(shè)置到一個特定的對象中。如
var qs = locatin.search.substring(1)
var hostName = location.hostName
var url = location.href
上面的代碼均用到了 location 對象彼念∨不可用 with 語句改寫:
with (location) {
var qs = search.substring(1)
var hostName = hostName
var url = href
}
switch 語句
switch 語句是一種流控制語句
switch (expression) {
case value: statement
break;
case value: statement
break;
...
default: statements
}
函數(shù)
通過函數(shù)可以封裝任意多條語句浅萧,可在任何地方調(diào)用,使用 function 關(guān)鍵字聲明哲思,后跟參數(shù)以及函數(shù)體:
function functionName (arg0, arg1, ... , argN) {
statement
}
ECMAScript 函數(shù)無法實現(xiàn)重載