JavaScript

一胧辽、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);
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衩椒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哮兰,更是在濱河造成了極大的恐慌毛萌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喝滞,死亡現(xiàn)場(chǎng)離奇詭異阁将,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)右遭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門做盅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窘哈,你說我怎么就攤上這事叹誉∽” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵裸扶,是天一觀的道長(zhǎng)帅韧。 經(jīng)常有香客問我端圈,道長(zhǎng)赡若,這世上最難降的妖魔是什么汛兜? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮哨鸭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇妓。我一直安慰自己像鸡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布哈恰。 她就那樣靜靜地躺著只估,像睡著了一般。 火紅的嫁衣襯著肌膚如雪着绷。 梳的紋絲不亂的頭發(fā)上蛔钙,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音荠医,去河邊找鬼吁脱。 笑死桑涎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兼贡。 我是一名探鬼主播攻冷,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼遍希!你這毒婦竟也來了等曼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤凿蒜,失蹤者是張志新(化名)和其女友劉穎禁谦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废封,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州泊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虱饿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拥诡。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氮发,靈堂內(nèi)的尸體忽然破棺而出渴肉,到底是詐尸還是另有隱情,我是刑警寧澤爽冕,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布仇祭,位于F島的核電站,受9級(jí)特大地震影響颈畸,放射性物質(zhì)發(fā)生泄漏乌奇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一眯娱、第九天 我趴在偏房一處隱蔽的房頂上張望礁苗。 院中可真熱鬧,春花似錦徙缴、人聲如沸试伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疏叨。三九已至,卻和暖如春穿剖,著一層夾襖步出監(jiān)牢的瞬間蚤蔓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工糊余, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秀又,地道東北人单寂。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涮坐,于是被迫代替她去往敵國(guó)和親凄贩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)袱讹,也就是一...
    悟名先生閱讀 4,150評(píng)論 0 13
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評(píng)論 0 21
  • 函數(shù)和對(duì)象 1疲扎、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句捷雕,而且...
    道無虛閱讀 4,566評(píng)論 0 5
  • FreeCodeCamp - Basic JavaScript 寫在前面: 我曾經(jīng)在進(jìn)谷前刷過這一套題椒丧,不過當(dāng)時(shí)只...
    付林恒閱讀 16,445評(píng)論 5 28
  • 框架的源碼分析,有些代碼可以暫時(shí)忽略救巷,如Spring如何進(jìn)行XML模式校驗(yàn)的壶熏、XML解析的細(xì)節(jié)等,這些代碼可以在了...
    JavaQ閱讀 1,009評(píng)論 2 13