一胧辽、JavaScript 概述
JavaScript是基于對(duì)象和事件驅(qū)動(dòng)的腳本語言,主要應(yīng)用在客戶端摄咆。
特點(diǎn)
1.互交性:信息的動(dòng)態(tài)交互
2.安全性:不允許直接訪問本地硬盤
3.跨平臺(tái)性:只要是可以解釋JavaScript的瀏覽器都可以執(zhí)行
JavaScript和Java的區(qū)別
1.JavaScript是基于對(duì)象人断;Java是面向?qū)ο蟆?br>
2.JavaScript只需要解釋就可以執(zhí)行恶迈;Java需要先編譯成字節(jié)碼文件,再執(zhí)行步做。
3.JavaScript是弱類型熔吗;Java是強(qiáng)類型桅狠。
強(qiáng)類型:就是對(duì)每種類型都有具體的劃分。
弱類型:只要有空間咨堤,想放什么放什么漩符。
JavaScript和HTML的結(jié)合方式
- 將js代碼分裝到<script type="text/javascript"></script>標(biāo)簽中
<scrit type"text/javascript">js內(nèi)容</script>
瀏覽器就可以解析了
- 將js封裝在一個(gè)js文件中嗜暴,并通過<script>標(biāo)簽中的src屬性進(jìn)行連接
即:
<script type="text/javascript" src="demo.js"></script>
eg:如果<script>標(biāo)簽中使用src屬性,那么改標(biāo)簽中封裝的js代碼不會(huì)被執(zhí)行
所以通常導(dǎo)入js文件都是用單獨(dú)的<script>標(biāo)簽完成萎战。
二.JavaScript語法
高級(jí)語言程序設(shè)計(jì)語言具備的共性內(nèi)容
(只不過各種語言對(duì)這些內(nèi)容的表現(xiàn)形式有所不同舆逃,基本思想是一樣的)
1.關(guān)鍵字
該語言中被賦予了特殊含義的單詞2.字符串
JavaScript的字符串就是用''或""括起來的字符表示。
轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符蔚约,比如\n表示換行涂籽,\t表示制表符又活,字符\本身也要轉(zhuǎn)義,所以\表示的字符就是\团赏。
1)多行字符串
用反引號(hào)...
表示
`這是一個(gè)
多行
字符串`;
2)將多個(gè)字符串連起來
可以用+號(hào)
也可以用${變量名}
var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '歲了!';
alert(message);
或
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);
3)操作字符串
//獲取字符串長(zhǎng)度
var s = 'Hello, world!';
s.length; // 13
//獲取某個(gè)指定的位置的字符串
s[0]; // 'H'
s[6]; // ' '
s[7]; // 'w'
s[12]; // '!'
s[13]; // undefined 超出范圍的索引不會(huì)報(bào)錯(cuò)舔清,但一律返回undefined
//把字符串都變成大寫
s.toUpperCase();
//把一個(gè)字符串全部變?yōu)樾?var lower = s.toLowerCase(); // 返回小寫字符串并賦值給變量lower
//搜索指定字符串出現(xiàn)的位置
s.indexOf('world'); // 返回7
s.indexOf('World'); // 沒有找到指定的子串曲初,返回-1
//返回指定索引區(qū)間的子串
s.substring(0, 5); // 從索引0開始到5(不包括5)臼婆,返回'hello'
s.substring(7); // 從索引7開始到結(jié)束,返回'world'
3.注釋
注解說明解釋的程序故响。用于調(diào)試程序颁独。4.變量
用于標(biāo)示內(nèi)存中的一片空間誓酒,用于存儲(chǔ)數(shù)據(jù)
該空間中的數(shù)據(jù)是可以變化的。
使用:當(dāng)數(shù)據(jù)不確定的時(shí)候
JavaScript的變量名是大小寫英文寨辩、數(shù)字歼冰、$和_的組合停巷,且不能用數(shù)字開頭。
申明一個(gè)變量用var語句
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
js中定義變量:
使用關(guān)鍵字**var**定義變量,js是**弱類型**的钧排。
賦值什么類型的值都可以
eg:
<script type="text/javascript">
var x = 3;
alert("x="+x);//這是一個(gè)函數(shù)均澳,將具體的參數(shù)通過對(duì)話框進(jìn)行顯示
</script>
- 5.運(yùn)算符
可以讓數(shù)據(jù)進(jìn)行運(yùn)算的符號(hào)
1)算數(shù)運(yùn)算符
+ - * / % ++ --
num++:先賦值再自加找前,先在num所在的表達(dá)式中使用num的當(dāng)前值,后讓num加1项戴;
++num:先自加再賦值周叮;讓num先加1躯枢,然后在num所在的表達(dá)式中使用num的新值;
eg:
<script type="text/javascript">
var a1 = 2.3,b1 = 4.7;
alert("a1+b1="+(a1+b1)); //結(jié)果:a1+b1=7
alert("12"+1); //結(jié)果121
alert("12"-1); //結(jié)果11
alert(true+1); //結(jié)果2
alert(false+1); //結(jié)果1
</script>
2)賦值運(yùn)算符
= += -= /= %=
eg:
<script type="text/javascript">
var a = 2;
a += 3;
alert("a="+a);
//結(jié)果:a=5
</script>
3)比較運(yùn)算符
運(yùn)算后的結(jié)果只能是true或者是false
> < >= <= != ==
== 會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較
=== 不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,如果數(shù)據(jù)類型不一致得糜,返回false朝抖,如果一致,再比較急侥。
另一個(gè)例外是NaN這個(gè)特殊的Number與所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判斷NaN的方法是通過isNaN()函數(shù):
isNaN(NaN); // true
4)邏輯運(yùn)算符
用于連接兩個(gè)boolean型的表達(dá)式
&& || !
返回值是true或false
5)位運(yùn)算符
& | ^ >> << >>>
<script type="text/javascript">
var c = 6;
alert(c&3); //2
//6的二進(jìn)制是110贝润,3的二進(jìn)制是011打掘,與鹏秋,所以是2
alert(5^3^3);//5
alert(c>>>1);//6除以2的一次方 即:3
alert(c<<2); //6*2*2=24
</script>
6)三元運(yùn)算符
侣夷? :
<script type="text/javascript">
3>0?alert("Yes"):alert("No"); //Yes
alert(3>0?100:200); //100
</script>
- 6.語句
用于對(duì)程序的運(yùn)行流程進(jìn)行控制的表達(dá)式
1)順序結(jié)構(gòu)
<script type="text/javascript">
//順序結(jié)構(gòu)
alert("acfk");
alert("ada12");
</script>
2)判斷結(jié)構(gòu)
<script type="text/javascript">
//判斷語句
var x = 3;
// if (x = 4) //將4賦值給x
//當(dāng)只有一行語句時(shí)可以省略{},慎用
if(4 == x){ //常量放在左邊是判斷
alert("Yes!");
}
else{
alert("no");
}
</script>
//多行條件判斷
var age = 3;
if (age >= 18) {
alert('adult');
} else if (age >= 6) {
alert('teenager');
} else {
alert('kid');
}
3)選擇結(jié)構(gòu)
<script type="text/javascript">
//選擇結(jié)構(gòu)
var x = "abc";
switch(x){
case "kk":
alert("a");
break;
case "abc":
alert("b");
break;
default:
alert("c");
break;
}
</script>
4)循環(huán)結(jié)構(gòu)
- for循環(huán)
//for循環(huán)輸出1到100的和
var x = 0;
var i;
for (i=1; i<=100; i++) {
x = x + i;
}
//最常用的for循環(huán)遍歷數(shù)組
var arr = ['Apple', 'Google', 'Microsoft'];
var i, x;
for (i=0; i<arr.length; i++) {
x = arr[i];
console.log(x);
}
//for循環(huán)的3個(gè)條件可以省略,如果沒有退出循環(huán)的判斷條件
就必須使用break語句退出循環(huán)祠够,否則就是死循環(huán)
- for in
for循環(huán)的一個(gè)變體是for ... in循環(huán)粪牲,它可以把一個(gè)對(duì)象的所有屬性依次循環(huán)出來
//輸出所有對(duì)象的屬性
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
console.log(key); // 'name', 'age', 'city'
}
//要過濾掉對(duì)象繼承的屬性腺阳,用hasOwnProperty()來實(shí)現(xiàn):
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key); // 'name', 'age', 'city'
}
}
//遍歷數(shù)組
var a = ['A', 'B', 'C'];
for (var i in a) {
console.log(i); // '0', '1', '2'
console.log(a[i]); // 'A', 'B', 'C'
}
//請(qǐng)注意,for ... in對(duì)Array的循環(huán)得到的是String而不是Number绎速。
- while循環(huán)
while循環(huán)只有一個(gè)判斷條件焙蚓,條件滿足购公,就不斷循環(huán),條件不滿足時(shí)則退出循環(huán)知残。
//計(jì)算100以內(nèi)奇數(shù)之和
var x = 0;
var n = 99;
while (n > 0) {
x = x + n;
n = n - 2;
}
x; // 2500
- do { ... } while()
它和while循環(huán)的唯一區(qū)別在于求妹,不是在每次循環(huán)開始的時(shí)候判斷條件,而是在每次循環(huán)完成的時(shí)候判斷條件
var n = 0;
do {
n = n + 1;
} while (n < 100);
n; // 100
//do { ... } while()循環(huán)體會(huì)至少執(zhí)行1次丑勤,而for和while循環(huán)則可能一次都不執(zhí)行吧趣。
5)其他結(jié)構(gòu)
- 7.函數(shù)
用于對(duì)功能代碼進(jìn)行封裝的强挫,便于提高復(fù)用性
1)定義函數(shù)
//第一種
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
//函數(shù)體內(nèi)部的語句在執(zhí)行時(shí)薛躬,一旦執(zhí)行到return時(shí)型宝,函數(shù)就執(zhí)行完畢,并將結(jié)果返回梨树。
//如果沒有return語句岖寞,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果仗谆,只是結(jié)果為undefined。
//第二種
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};
//注意末尾的藻雪;表示賦值語句結(jié)束
//function (x) { ... }是一個(gè)匿名函數(shù)勉耀,它沒有函數(shù)名捷绒。
//但是暖侨,這個(gè)匿名函數(shù)賦值給了變量abs,所以京郑,通過變量abs就可以調(diào)用該函數(shù)。
function指出這是一個(gè)函數(shù)定義跟狱;
abs是函數(shù)的名稱驶臊;
(x)括號(hào)內(nèi)列出函數(shù)的參數(shù)叼丑,多個(gè)參數(shù)以,分隔
{ ... }之間的代碼是函數(shù)體鸠信,可以包含若干語句,甚至可以沒有任何語句爽茴。
2)調(diào)用函數(shù)
//順序傳入?yún)?shù)即可
abs(10); // 返回10
abs(-9); // 返回9
abs(); // 返回NaN
abs(10, 'blablabla'); // 返回10
//為避免收到undefined(空)可以對(duì)參數(shù)進(jìn)行檢查
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
3)arguments關(guān)鍵字
只在函數(shù)內(nèi)部起作用室奏,并且永遠(yuǎn)指向當(dāng)前函數(shù)的調(diào)用者傳入的所有參數(shù)辕坝。
類似一個(gè)數(shù)組酱畅,但不是數(shù)組
function foo(x) {
console.log('x = ' + x);
for (var i=0; i<arguments.length; i++) {
console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
//輸出
x = 10
arg 0 = 10
arg 1 = 20
arg 2 = 30
//判斷傳入?yún)?shù)的個(gè)數(shù)
// foo(a[, b], c)
// 接收2~3個(gè)參數(shù),b是可選參數(shù)窖逗,如果只傳2個(gè)參數(shù)餐蔬,b默認(rèn)為null:
function foo(a, b, c) {
if (arguments.length === 2) {
// 實(shí)際拿到的參數(shù)是a和b樊诺,c為undefined
c = b; // 把b賦給c
b = null; // b變?yōu)槟J(rèn)值
}
// ...
}
- 8.數(shù)組
對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)词爬,便于操作。也就是容器锅锨。
JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型
//數(shù)組索引
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引為0的元素,即1
arr[5]; // 返回索引為5的元素必指,即true
arr[6]; // 索引超出了范圍塔橡,返回undefined
var arr = [1, 2, 3];
//數(shù)組長(zhǎng)度
arr.length; // 3
//直接給length賦值
arr.length = 6;
arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr變?yōu)閇1, 2]
//Array可以通過索引把對(duì)應(yīng)的元素修改為新的值霜第,因此庶诡,對(duì)Array的索引進(jìn)行賦值會(huì)直接修改這個(gè)Array
var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr現(xiàn)在變?yōu)閇'A', 99, 'C']
arr[5] = 'x';
arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, 'x']
//搜索一個(gè)指定的元素的位置
var arr = [10, 20, '30', 'xyz'];
arr.indexOf(10); // 元素10的索引為0
arr.indexOf(20); // 元素20的索引為1
arr.indexOf(30); // 元素30沒有找到末誓,返回-1
arr.indexOf('30'); // 元素'30'的索引為2
//截取Array的部分元素书蚪,然后返回一個(gè)新的Array
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 從索引0開始殊校,到索引3結(jié)束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 從索引3開始到結(jié)束: ['D', 'E', 'F', 'G']
//如果不給slice()傳遞任何參數(shù)呕屎,它就會(huì)從頭到尾截取所有元素
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G']
aCopy === arr; // false
//push()向Array的末尾添加若干元素秀睛,pop()則把Array的最后一個(gè)元素刪除掉:
var arr = [1, 2];
arr.push('A', 'B'); // 返回Array新的長(zhǎng)度: 4
arr; // [1, 2, 'A', 'B']
arr.pop(); // pop()返回'B'
arr; // [1, 2, 'A']
arr.pop(); arr.pop(); arr.pop(); // 連續(xù)pop 3次
arr; // []
arr.pop(); // 空數(shù)組繼續(xù)pop不會(huì)報(bào)錯(cuò)莲祸,而是返回undefined
arr; // []
//如果要往Array的頭部添加若干元素锐帜,使用unshift()方法,shift()方法則把Array的第一個(gè)元素刪掉
var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的長(zhǎng)度: 4
arr; // ['A', 'B', 1, 2]
arr.shift(); // 'A'
arr; // ['B', 1, 2]
arr.shift(); arr.shift(); arr.shift(); // 連續(xù)shift 3次
arr; // []
arr.shift(); // 空數(shù)組繼續(xù)shift不會(huì)報(bào)錯(cuò)允瞧,而是返回undefined
arr; // []
//sort()可以對(duì)當(dāng)前Array進(jìn)行排序瓷式,它會(huì)直接修改當(dāng)前Array的元素位置,直接調(diào)用時(shí)视卢,按照默認(rèn)順序排序
var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']
//reverse()把整個(gè)Array的元素反轉(zhuǎn)廊驼、
var arr = ['one', 'two', 'three'];
arr.reverse();
arr; // ['three', 'two', 'one']
//splice()方法是修改Array的“萬能方法”妒挎,它可以從指定的索引開始刪除若干元素酝掩,然后再?gòu)脑撐恢锰砑尤舾稍?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']
//把當(dāng)前的Array和另一個(gè)Array連接起來,并返回一個(gè)新的Array
var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
//把當(dāng)前Array的每個(gè)元素都用指定的字符串連接起來原朝,然后返回連接后的字符串
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
//如果數(shù)組的某個(gè)元素又是一個(gè)Array喳坠,則可以形成多維數(shù)組
var arr = [[1, 2, 3], [400, 500, 600], '-'];
var y = arr[1];//獲取[400,500,600]這個(gè)數(shù)組
var x = y[1];
console.log(x); // x為500
- 9.對(duì)象
只要是基于對(duì)象的語言壕鹉,或者是面向?qū)ο蟮恼Z言
對(duì)象就是一個(gè)封裝體聋涨。既可以封裝數(shù)據(jù)也可以封裝函數(shù)牍白。
JavaScript的對(duì)象是一組由鍵-值組成的無序集合
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
JavaScript對(duì)象的鍵都是字符串類型,值可以是任意數(shù)據(jù)類型笙各。上述person對(duì)象一共定義了6個(gè)鍵值對(duì)杈抢,其中每個(gè)鍵又稱為對(duì)象的屬性仑性,例如,person的name屬性為'Bob'何陆,zipcode屬性為null豹储。
要獲取一個(gè)對(duì)象的屬性剥扣,我們用對(duì)象變量.屬性名的方式:
person.name; // 'Bob'
person.zipcode; // null
JavaScript用一個(gè){...}表示一個(gè)對(duì)象,鍵值對(duì)以xxx: xxx形式申明佳魔,用,隔開晦炊。注意断国,最后一個(gè)鍵值對(duì)不需要在末尾加,并思,
var xiaohong = {
name: '小紅',
'middle-school': 'No.1 Middle School'
};
xiaohong的屬性名middle-school不是一個(gè)有效的變量语稠,
就需要用''括起來仙畦。訪問這個(gè)屬性也無法使用.操作符,必須用['xxx']來訪問:
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小紅'
xiaohong.name; // '小紅'
由于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ò)
檢測(cè)一個(gè)對(duì)象是否擁有某一屬性
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
in判斷一個(gè)屬性存在檐什,這個(gè)屬性不一定是xiaoming的乃正,它可能是xiaoming繼承得到的:
任何一個(gè)對(duì)象都有toString屬性婶博,因?yàn)閠oString定義在object對(duì)象中,而所有對(duì)象最終都會(huì)在原型鏈上指向object叹阔。
要判斷一個(gè)屬性是否是xiaoming自身?yè)碛械拇茫皇抢^承得到的蒋歌,可以用hasOwnProperty()方法
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
三、Map和Set
1.Map
Map是一組鍵值對(duì)的結(jié)構(gòu)修档,具有極快的查找速度吱窝。
Map就是當(dāng)你需要兩個(gè)數(shù)組的信息一一對(duì)應(yīng)的時(shí)候不容易遍歷和對(duì)應(yīng)迫靖,所以就會(huì)出現(xiàn)Map鍵值對(duì)系宜,可以快速對(duì)應(yīng)輸出
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
初始化Map需要一個(gè)二維數(shù)組盹牧,或者直接初始化一個(gè)空Map
Map方法:
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 刪除key 'Adam'
m.get('Adam'); // undefined
//一個(gè)key只能對(duì)應(yīng)一個(gè)value,所以口柳,
多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉:
var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); // 88
2.Set
Set和Map類似有滑,也是一組key的集合跃闹,但不存儲(chǔ)value。
由于key不能重復(fù)毛好,所以望艺,在Set中,沒有重復(fù)的key肌访。
創(chuàng)建Set
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重復(fù)的元素會(huì)在Set中自動(dòng)被過濾掉
Set方法
//添加元素到Set中
s.add(4);
s; // Set {1, 2, 3, 4}
//刪除元素
var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
四荣茫、iterable
遍歷Array可以采用下標(biāo)循環(huán)场靴,由于遍歷Map和Set無法使用下標(biāo)啡莉。為了統(tǒng)一集合類型港准,引入iterable遍歷器遍歷。
Array咧欣、Map和Set都屬于iterable類型浅缸。
1.for...of
具有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...of 和for in的區(qū)別在于
for...in 會(huì)把不屬于數(shù)組.length的屬性也會(huì)遍歷出來
而for...of只循環(huán)集合本身的元素
eg
//for...in
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
//for...of
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
console.log(x); // 'A', 'B', 'C'
}
2.iterable內(nèi)置方法forEach
forEach接收一個(gè)函數(shù),每次迭代就自動(dòng)回調(diào)該函數(shù)
1)數(shù)組
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向當(dāng)前元素的值
// index: 指向當(dāng)前索引
// array: 指向Array對(duì)象本身
console.log(element + ', index = ' + index);
});
//輸出
A, index = 0
B, index = 1
C, index = 2
//也可以只獲取element
a.forEach(function (element) {
console.log(element);
});
//輸出
A
B
C
2)Set
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
Set沒有索引魄咕,因此回調(diào)函數(shù)的前兩個(gè)參數(shù)都是元素本身
3)Map
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});