一 語(yǔ)法
JavaScript的語(yǔ)法和Java語(yǔ)言類似伴嗡,每個(gè)語(yǔ)句以;結(jié)束,語(yǔ)句塊用{...}瘪校。但是澄暮,JavaScript并不強(qiáng)制要求在每個(gè)語(yǔ)句的結(jié)尾加;,瀏覽器中負(fù)責(zé)執(zhí)行JavaScript代碼的引擎會(huì)自動(dòng)在每個(gè)語(yǔ)句的結(jié)尾補(bǔ)上;阱扬。
但是泣懊,讓 JavaScript 引擎自動(dòng)添加分號(hào)會(huì)在某些情況下改變程序的語(yǔ)義,導(dǎo)致運(yùn)行結(jié)果與期望的不一致麻惶。
二 數(shù)據(jù)類型
1 Number
JavaScript不區(qū)分整數(shù)和浮點(diǎn)數(shù)馍刮,統(tǒng)一用Number表示,以下都是合法的Number類型:
123; // 整數(shù)123
0.456; // 浮點(diǎn)數(shù)0.456
1.2345e3; // 科學(xué)計(jì)數(shù)法表示1.2345x1000窃蹋,等同于1234.5
-99; // 負(fù)數(shù)
NaN; // NaN表示Not a Number卡啰,當(dāng)無(wú)法計(jì)算結(jié)果時(shí)用NaN表示
Infinity; // Infinity表示無(wú)限大静稻,當(dāng)數(shù)值超過了JavaScript的Number所能表示的最大值時(shí),就表示為Infinity
Number可以直接做四則運(yùn)算匈辱,規(guī)則和數(shù)學(xué)一致振湾。
2 字符串
字符串是以單引號(hào)'或雙引號(hào)"括起來(lái)的任意文本,比如'abc'亡脸,"xyz"等等押搪。
(1)字符轉(zhuǎn)義:
轉(zhuǎn)義字符\
可以轉(zhuǎn)義很多字符,比如\n表示換行梗掰,\t表示制表符嵌言,字符\本身也要轉(zhuǎn)義,所以\\
表示的字符就是\及穗。
ASCII字符可以以\x##形式的十六進(jìn)制表示摧茴,例如:
'\x41'; // 完全等同于 'A'
還可以用\u####表示一個(gè)Unicode字符:
'\u4e2d\u6587'; // 完全等同于 '中文'
(2)多行字符
由于多行字符串用\n寫起來(lái)比較費(fèi)事,所以最新的ES6標(biāo)準(zhǔn)新增了一種多行字符串的表示方法埂陆,用反引號(hào)(ESC下方的鍵)表示:
`這是一個(gè)
多行
字符串`;
(3)模板字符串
要把多個(gè)字符串連接起來(lái)苛白,可以用+號(hào)連接:
var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '歲了!';
alert(message);
如果有很多變量需要連接,用+號(hào)就比較麻煩焚虱。ES6新增了一種模板字符串购裙,表示方法和上面的多行字符串一樣,但是它會(huì)自動(dòng)替換字符串中的變量:
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);
3 布爾值
三種運(yùn)算:&& 鹃栽,||躏率, !
4 比較運(yùn)算符
當(dāng)我們對(duì)Number做比較時(shí)民鼓,可以通過比較運(yùn)算符得到一個(gè)布爾值:
2 > 5; // false
5 >= 2; // true
7 == 7; // true
實(shí)際上薇芝,JavaScript允許對(duì)任意數(shù)據(jù)類型做比較:
false == 0; // true
false === 0; // false
==和===的區(qū)別:
==比較:會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較,很多時(shí)候會(huì)得到詭異的結(jié)果丰嘉;
===比較:不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型夯到,如果數(shù)據(jù)類型不一致,返回false饮亏,如果一致再比較耍贾。
由于JavaScript的這種設(shè)計(jì)缺陷,不要使用==比較路幸,始終堅(jiān)持使用===比較
另一個(gè)例外是NaN這個(gè)特殊的Number與所有其他值都不相等荐开,包括它自己
NaN === NaN; // false
唯一能判斷NaN的方法是通過isNaN()函數(shù):
isNaN(NaN); // true
最后要注意浮點(diǎn)數(shù)的相等比較:
1 / 3 === (1 - 2 / 3); // false
這不是JavaScript的設(shè)計(jì)缺陷。浮點(diǎn)數(shù)在運(yùn)算過程中會(huì)產(chǎn)生誤差简肴,因?yàn)橛?jì)算機(jī)無(wú)法精確表示無(wú)限循環(huán)小數(shù)誓焦。要比較兩個(gè)浮點(diǎn)數(shù)是否相等,只能計(jì)算它們之差的絕對(duì)值,看是否小于某個(gè)閾值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示一個(gè)“空”的值杂伟,它和0以及空字符串''不同移层,0是一個(gè)數(shù)值,''表示長(zhǎng)度為0的字符串赫粥,而null表示“空”观话。
在其他語(yǔ)言中,也有類似JavaScript的null的表示越平,例如Java也用null频蛔,Swift用nil,Python用None表示秦叛。但是晦溪,在JavaScript中,還有一個(gè)和null類似的undefined挣跋,它表示“未定義”三圆。
JavaScript的設(shè)計(jì)者希望用null表示一個(gè)空的值,而undefined表示值未定義避咆。事實(shí)證明舟肉,這并沒有什么卵用,區(qū)分兩者的意義不大查库。大多數(shù)情況下路媚,我們都應(yīng)該用null。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用
5 數(shù)組
數(shù)組是一組按順序排列的集合樊销,集合的每個(gè)值稱為元素整慎。JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型。例如:
[1, 2, 3.14, 'Hello', null, true];
另一種創(chuàng)建數(shù)組的方法是通過Array()函數(shù)實(shí)現(xiàn):
new Array(1, 2, 3); // 創(chuàng)建了數(shù)組[1, 2, 3]
6 對(duì)象
(1)定義:
JavaScript的對(duì)象是一組由鍵-值組成的無(wú)序集合围苫。例如裤园,為了描述“小明”這個(gè)淘氣的小朋友,我們可以用若干鍵值對(duì)來(lái)描述他:
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
(2)訪問屬性:
訪問屬性是通過.操作符(即:對(duì)象變量.屬性名
的方式)完成的够吩,但這要求屬性名必須是一個(gè)有效的變量名。如果屬性名包含特殊字符丈氓,就必須用''括起來(lái):
var xiaohong = {
name: '小紅',
'middle-school': 'No.1 Middle School'
};
xiaohong
的屬性名middle-school
不是一個(gè)有效的變量周循,就需要用''括起來(lái)。訪問這個(gè)屬性也無(wú)法使用.操作符万俗,必須用['xxx']
來(lái)訪問:
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小紅'
xiaohong.name; // '小紅'
如果訪問一個(gè)不存在的屬性會(huì)返回什么呢湾笛?JavaScript規(guī)定,訪問不存在的屬性不報(bào)錯(cuò)闰歪,而是返回undefined:
(3)添加和刪除屬性:
由于JavaScript的對(duì)象是動(dòng)態(tài)類型嚎研,你可以自由地給一個(gè)對(duì)象添加或刪除屬性:
var xiaoming = {
name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一個(gè)age屬性
xiaoming.age; // 18
delete xiaoming.age; // 刪除age屬性
xiaoming.age; // undefined
delete xiaoming['name']; // 刪除name屬性
xiaoming.name; // undefined
delete xiaoming.school; // 刪除一個(gè)不存在的school屬性也不會(huì)報(bào)錯(cuò)
(4)檢測(cè)對(duì)象是否擁有某屬性:
如果我們要檢測(cè)xiaoming是否擁有某一屬性(包括從父類繼承的),可以用in操作符:
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false
要判斷一個(gè)屬性是否是xiaoming自身?yè)碛械模皇抢^承得到的临扮,可以用hasOwnProperty()方法:
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
7 變量
變量在JavaScript中就是用一個(gè)變量名表示论矾,變量名是大小寫英文、數(shù)字杆勇、$和_的組合贪壳,且不能用數(shù)字開頭。變量名也不能是JavaScript的關(guān)鍵字蚜退,如if闰靴、while等。申明一個(gè)變量用var語(yǔ)句钻注,比如:
var a; // 申明了變量a蚂且,此時(shí)a的值為undefined
var $b = 1; // 申明了變量$b,同時(shí)給$b賦值幅恋,此時(shí)$b的值為1
var s_007 = '007'; // s_007是一個(gè)字符串
var Answer = true; // Answer是一個(gè)布爾值true
var t = null; // t的值是null
在JavaScript中杏死,使用等號(hào)=對(duì)變量進(jìn)行賦值〖亚玻可以把任意數(shù)據(jù)類型賦值給變量识埋,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類型的變量零渐,但是要注意只能用var申明一次窒舟。這種變量本身類型不固定的語(yǔ)言稱之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言诵盼。靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類型惠豺,如果賦值的時(shí)候類型不匹配,就會(huì)報(bào)錯(cuò)风宁。例如Java洁墙,Swift是靜態(tài)語(yǔ)言