快速入門
生命變量用 var ,語句塊用花括號(hào)萨西,注釋類似C,可以用 // 或者 /**/
數(shù)據(jù)類型
JavaScript 的數(shù)據(jù)類型有 Number 旭旭、字符串谎脯、布爾型、數(shù)組和對(duì)象等持寄。
JavaScript 不區(qū)分整數(shù)和浮點(diǎn)數(shù)源梭,數(shù)值的運(yùn)算符類似C。
字符串可以用雙引號(hào)或者單引號(hào)引起來稍味。
布爾值為 true 或者 false 废麻,運(yùn)算符類似C。
比較運(yùn)算符
JavaScript的相等比較運(yùn)算符有兩種模庐,一種是==烛愧,它會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較,很多時(shí)候掂碱,會(huì)得到非常詭異的結(jié)果屑彻;另一種是===,它不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型顶吮,如果數(shù)據(jù)類型不一致,返回false粪薛,如果一致悴了,再比較。這是JavaScript的設(shè)計(jì)缺陷违寿,在實(shí)際使用中都應(yīng)該用 === 湃交。
注意:NaN 在比較的時(shí)候是不能用 === 的,因?yàn)?NaN 不等于任何一個(gè)指藤巢,NaN === NaN 會(huì)返回 false 搞莺。判斷是否為 NaN 只能用 isNaN() 函數(shù)。
此外還要注意浮點(diǎn)數(shù)的比較掂咒,因?yàn)楦↑c(diǎn)數(shù)在運(yùn)算過程中會(huì)產(chǎn)生誤差才沧,因?yàn)橛?jì)算機(jī)無法精確表示無限循環(huán)小數(shù)。要比較兩個(gè)浮點(diǎn)數(shù)是否相等绍刮,只能計(jì)算它們之差的絕對(duì)值温圆,看是否小于某個(gè)閾值:
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null 和 undefined
JavaScript 中的 null 類似 Python 中的 None ,表示空值孩革。
JavaScript 中的 undefined 表示未定義岁歉,但用處不太大,僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用膝蜈。
字符串
字符串用單引號(hào)或者雙引號(hào)引起來锅移,轉(zhuǎn)義則使用反斜杠 \ 熔掺。使用 \x 可以后接十六進(jìn)制,用 \u 跟一個(gè) Unicode 字符非剃。
多行字符串
多行字符串可以用反引號(hào)引起來置逻,比如:
`這是一個(gè)
多行
字符串`;
字符串常用函數(shù)有:
- 字符串拼接用加號(hào)+
- 字符串長度用 length 屬性,例如 str.length
- 用中括號(hào)下標(biāo)可以取出某個(gè)位置的字符努潘,比如 str[2]
- toUpperCase() 或 toLowerCase() 能把字符串轉(zhuǎn)位全大寫或全小寫
- indexOf() 函數(shù)可以搜索字符串出現(xiàn)的位置(區(qū)分大小寫)诽偷,失敗返回 -1
- substring(start, end) 選出從start位置開始到end位置(不包括end)的子串
數(shù)組
Array 中可以包含任意類型的元素,用 length 可以獲得其元素個(gè)數(shù)疯坤。通過設(shè)置 length 可以延長或截?cái)鄶?shù)組报慕,但不建議這么做。
與String類似压怠,Array也可以通過 indexOf() 來搜索一個(gè)指定的元素的位置眠冈,沒找到返回 -1 。
使用 slice 可以截取數(shù)據(jù)的一部分菌瘫,返回 一個(gè)新的數(shù)組 蜗顽。
使用 push和pop 可以向數(shù)組尾部添加和彈出元素,使用 unshift和shift 可以向數(shù)組頭部添加或移出元素雨让。
使用 sort 可以對(duì)數(shù)組元素進(jìn)行排序雇盖,使用 reverse 可以把數(shù)組元素顛倒,這兩個(gè)函數(shù)都是 破壞性 的栖忠!
使用 concat 可以把兩個(gè)數(shù)組拼接起來崔挖。
join可以用一個(gè)分隔符把數(shù)組的元素串聯(lián)起來。
splice
splice 是數(shù)組的萬能操作函數(shù)庵寞,可以從指定的索引開始刪除若干元素狸相,然后再從該位置添加若干元素,如:
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 從索引2開始刪除3個(gè)元素,然后再添加兩個(gè)元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回刪除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只刪除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不刪除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因?yàn)闆]有刪除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
splice 的第一個(gè)參數(shù)是開始的位置捐川,第二個(gè)參數(shù)是刪除元素的個(gè)數(shù)脓鹃,隨后的元素是要插入的元素。這個(gè)函數(shù)也是 破壞性 的古沥!
對(duì)象
JavaScript的對(duì)象是一種無序的集合數(shù)據(jù)類型瘸右,它由若干鍵值對(duì)組成。例如:
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
屬性名如果包含特殊符號(hào)渐白,需要用引號(hào)引起來尊浓,且在訪問的時(shí)候就不能用 . 來訪問,必須用中括號(hào)的方式纯衍,例如:
var xiaohong = {
name: '小紅',
'middle-school': 'No.1 Middle School'
};
console.log(xiaohong['middle-school'])
判斷一個(gè)對(duì)象是否擁有某個(gè)屬性栋齿,可以使用 in ,例如:
'name' in xiaoming; // true
'grade' in xiaoming; // false
要判斷一個(gè)屬性是否是對(duì)象自身擁有的,而不是繼承得到的瓦堵,可以用 hasOwnProperty() 方法:
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
Map
Map 是鍵值對(duì)的類型基协,與JS對(duì)象有所不同的是,對(duì)象的鍵只能是字符串菇用,而Map則無此限制澜驮。
初始化 Map 可以傳入一個(gè)二維數(shù)組,或者設(shè)置一個(gè)空 Map 再 set 值惋鸥;取得值則用 get 方法杂穷;判斷有無某個(gè)鍵用 has 方法,刪除用 delete 方法卦绣。
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.set('John', 97)
m.delete('Tracy')
m.has('Adam') // false
m.get('Bob') // 75
Set
Set 是集合耐量,其中不能有重復(fù)元素,可以用一維數(shù)組來初始化集合滤港,使用 add 往里加元素廊蜒,使用 delete 刪除元素,用 has 來判斷是否有某個(gè)元素溅漾,例如:
s = new Set(["Alice", "Bob"])
s.add("Charlie")
s.delete("Bob")
s.has("Bob") // false
注意I蕉!! Map和Set是ES6標(biāo)準(zhǔn)新增的數(shù)據(jù)類型添履!
循環(huán)
JavaScript 除了支持類似C語言的for屁倔、while、do...while 循環(huán)外暮胧,還支持 for ... in 循環(huán)來遍歷對(duì)象或數(shù)組汰现,例如:
var person = {fname:"John", lname:"Doe", age:25};
var text = "";
for (var x in person) {
text += person[x];
}
console.log(text) // JohnDoe25
var a = [1, 2, 3];
for (var x in a) {
console.log(x);
}
條件判斷
JavaScript 的條件判斷用 if ... else if ... else 。
iterable
由于遍歷Map和Set無法使用下標(biāo)叔壤。為了統(tǒng)一集合類型,ES6標(biāo)準(zhǔn)引入了新的iterable類型口叙,Array炼绘、Map和Set都屬于iterable類型。具有iterable類型的集合可以通過新的 for ... of 循環(huán)來遍歷妄田。
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍歷Array
console.log(x);
}
for (var x of s) { // 遍歷Set
console.log(x);
}
for (var x of m) { // 遍歷Map
console.log(x[0] + '=' + x[1]);
}
for...in 循環(huán)存在一些歷史遺留問題俺亮,而 for ... of 循環(huán)則解決了這些問題。
更好的方法直接使用iterable內(nèi)置的forEach方法疟呐,它接收一個(gè)函數(shù)脚曾,每次迭代就自動(dòng)回調(diào)該函數(shù),該函數(shù)的第一個(gè)參數(shù)是元素启具,第二個(gè)元素是當(dāng)前索引本讥,第三個(gè)參數(shù)是集合對(duì)象本身。例如:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
如果對(duì)某些參數(shù)不感興趣,由于JavaScript的函數(shù)調(diào)用不要求參數(shù)必須一致拷沸,因此可以 忽略它們 色查。例如,只需要獲得Array的element:
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
console.log(element);
});