ES6語法
let
let聲明的變量只在所處于的塊級(jí)有效
if (true) {
let a = 10;
}
console.log(a) // a is not defined
注意:使用let關(guān)鍵字聲明的變量才具有塊級(jí)作用域,使用var聲明的變量不具備塊級(jí)作用域特性
不存在變量提升
console.log(a); // a is not defined
let a = 20;
暫時(shí)性死區(qū)
var tmp = 123;
if (true) {
tmp = 'abc';
let tmp;
}
經(jīng)典面試題
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();
arr[1]();
此題的關(guān)鍵點(diǎn)在于變量i是全局的,函數(shù)執(zhí)行時(shí)輸出的都是全局作用域下的i值激捏。
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();
arr[1]();
此題的關(guān)鍵點(diǎn)在于每次循環(huán)都會(huì)產(chǎn)生一個(gè)塊級(jí)作用域远舅,每個(gè)塊級(jí)作用域中的變量都是不同的痕钢,函數(shù)執(zhí)行時(shí)輸出的是自己上一級(jí)(循環(huán)產(chǎn)生的塊級(jí)作用域)作用域下的i值.
小結(jié)
- let關(guān)鍵字就是用來聲明變量的
- 使用let關(guān)鍵字聲明的變量具有塊級(jí)作用域
- 在一個(gè)大括號(hào)中 使用let關(guān)鍵字聲明的變量才具有塊級(jí)作用域 var關(guān)鍵字是不具備這個(gè)特點(diǎn)的
- 防止循環(huán)變量變成全局變量
- 使用let關(guān)鍵字聲明的變量沒有變量提升
- 使用let關(guān)鍵字聲明的變量具有暫時(shí)性死區(qū)特性
const
聲明常量,常量就是值(內(nèi)存地址)不能變化的量
具有塊級(jí)作用域
if (true) {
const a = 10;
}
console.log(a) // a is not defined
聲明常量時(shí)必須賦值
const PI; // Missing initializer in const declaration
常量賦值后爆办,值不能修改
const PI = 3.14;
PI = 100; // Assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b'];
ary = ['a', 'b']; // Assignment to constant variable.
小結(jié)
- const聲明的變量是一個(gè)常量
- 既然是常量不能重新進(jìn)行賦值距辆,如果是基本數(shù)據(jù)類型暮刃,不能更改值,如果是復(fù)雜數(shù)據(jù)類型诸蚕,不能更改地址值
- 聲明 const時(shí)候必須要給定值
let、const坏瘩、var 的區(qū)別
- 使用 var 聲明的變量漠魏,其作用域?yàn)樵撜Z句所在的函數(shù)內(nèi),且存在變量提升現(xiàn)象
- 使用 let 聲明的變量哪自,其作用域?yàn)樵撜Z句所在的代碼塊內(nèi)禁熏,不存在變量提升
-
使用 const 聲明的是常量,在后面出現(xiàn)的代碼中不能再修改該常量的值
解構(gòu)賦值
數(shù)組解構(gòu)
let [a, b, c] = [1, 2, 3];
console.log(a)//1
console.log(b)//2
console.log(c)//3
//如果解構(gòu)不成功隙笆,變量的值為undefined
對(duì)象解構(gòu)
let person = { name: 'zhangsan', age: 20 };
let { name, age } = person;
console.log(name); // 'zhangsan'
console.log(age); // 20
let {name: myName, age: myAge} = person; // myName myAge 屬于別名
console.log(myName); // 'zhangsan'
console.log(myAge); // 20
小結(jié)
- 解構(gòu)賦值就是把數(shù)據(jù)結(jié)構(gòu)分解,然后給變量進(jìn)行賦值
- 如果結(jié)構(gòu)不成功您访,變量跟數(shù)值個(gè)數(shù)不匹配的時(shí)候剪决,變量的值為undefined
- 數(shù)組解構(gòu)用中括號(hào)包裹,多個(gè)變量用逗號(hào)隔開享言,對(duì)象解構(gòu)用花括號(hào)包裹渗鬼,多個(gè)變量用逗號(hào)隔開
- 利用解構(gòu)賦值能夠讓我們方便的去取對(duì)象中的屬性跟方法
箭頭函數(shù)
ES6中新增的定義函數(shù)的方式譬胎。
() => {} //():代表是函數(shù); =>:必須要的符號(hào)偏化,指向哪一個(gè)代碼塊镐侯;{}:函數(shù)體
const fn = () => {}//代表把一個(gè)函數(shù)賦值給fn
函數(shù)體中只有一句代碼,且代碼的執(zhí)行結(jié)果就是返回值韵卤,可以省略大括號(hào)
function sum(num1, num2) {
return num1 + num2;
}
//es6寫法
const sum = (num1, num2) => num1 + num2;
如果形參只有一個(gè)怜俐,可以省略小括號(hào)
function fn (v) {
return v;
}
//es6寫法
const fn = v => v;
箭頭函數(shù)不綁定this關(guān)鍵字,箭頭函數(shù)中的this贴谎,指向的是函數(shù)定義位置的上下文this
const obj = { name: '張三'}
function fn () {
console.log(this);//this 指向 是obj對(duì)象
return () => {
console.log(this);//this 指向 的是箭頭函數(shù)定義的位置季稳,那么這個(gè)箭頭函數(shù)定義在fn里面景鼠,而這個(gè)fn指向是的obj對(duì)象,所以這個(gè)this也指向是obj對(duì)象
}
}
const resFn = fn.call(obj);
resFn();
小結(jié)
- 箭頭函數(shù)中不綁定this溯香,箭頭函數(shù)中的this指向是它所定義的位置浓恶,可以簡(jiǎn)單理解成,定義箭頭函數(shù)中的作用域的this指向誰湿镀,它就指向誰
- 箭頭函數(shù)的優(yōu)點(diǎn)在于解決了this執(zhí)行環(huán)境所造成的一些問題勉痴。比如:解決了匿名函數(shù)this指向的問題(匿名函數(shù)的執(zhí)行環(huán)境具有全局性)树肃,包括setTimeout和setInterval中使用this所造成的問題
面試題
var age = 100;
var obj = {
age: 20,
say: () => {
alert(this.age)
}
}
obj.say();//箭頭函數(shù)this指向的是被聲明的作用域里面胸嘴,而對(duì)象沒有作用域的,所以箭頭函數(shù)雖然在對(duì)象中被定義磁玉,但是this指向的是全局作用域
剩余參數(shù)
剩余參數(shù)語法允許我們將一個(gè)不定數(shù)量的參數(shù)表示為一個(gè)數(shù)組驾讲,不定參數(shù)定義方式席赂,這種方式很方便的去聲明不知道參數(shù)情況下的一個(gè)函數(shù)
function sum (first, ...args) {
console.log(first); // 10
console.log(args); // [20, 30]
}
sum(10, 20, 30)
剩余參數(shù)和解構(gòu)配合使用
let students = ['wangwu', 'zhangsan', 'lisi'];
let [s1, ...s2] = students;
console.log(s1); // 'wangwu'
console.log(s2); // ['zhangsan', 'lisi']
ES6 的內(nèi)置對(duì)象擴(kuò)展
Array 的擴(kuò)展方法
擴(kuò)展運(yùn)算符(展開語法)
擴(kuò)展運(yùn)算符可以將數(shù)組或者對(duì)象轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列
let ary = [1, 2, 3];
...ary // 1, 2, 3
console.log(...ary); // 1 2 3,相當(dāng)于下面的代碼
console.log(1,2,3);
擴(kuò)展運(yùn)算符可以應(yīng)用于合并數(shù)組
// 方法一
let ary1 = [1, 2, 3];
let ary2 = [3, 4, 5];
let ary3 = [...ary1, ...ary2];
// 方法二
ary1.push(...ary2);
將類數(shù)組或可遍歷對(duì)象轉(zhuǎn)換為真正的數(shù)組
let oDivs = document.getElementsByTagName('div');
oDivs = [...oDivs];
構(gòu)造函數(shù)方法:Array.from()
將偽數(shù)組或可遍歷對(duì)象轉(zhuǎn)換為真正的數(shù)組
//定義一個(gè)集合
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
//轉(zhuǎn)成數(shù)組
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
方法還可以接受第二個(gè)參數(shù),作用類似于數(shù)組的map方法掠拳,用來對(duì)每個(gè)元素進(jìn)行處理溺欧,將處理后的值放入返回的數(shù)組
let arrayLike = {
"0": 1,
"1": 2,
"length": 2
}
let newAry = Array.from(arrayLike, item => item *2)//[2,4]
注意:如果是對(duì)象,那么屬性需要寫對(duì)應(yīng)的索引
實(shí)例方法:find()
用于找出第一個(gè)符合條件的數(shù)組成員芥牌,如果沒有找到返回undefined
let ary = [{
id: 1,
name: '張三'
}, {
id: 2,
name: '李四'
}];
let target = ary.find((item, index) => item.id == 2);//找數(shù)組里面符合條件的值聂使,當(dāng)數(shù)組中元素id等于2的查找出來柏靶,注意,只會(huì)匹配第一個(gè)
實(shí)例方法:findIndex()
用于找出第一個(gè)符合條件的數(shù)組成員的位置痘昌,如果沒有找到返回-1
let ary = [1, 5, 10, 15];
let index = ary.findIndex((value, index) => value > 9);
console.log(index); // 2
實(shí)例方法:includes()
判斷某個(gè)數(shù)組是否包含給定的值梆靖,返回布爾值笔诵。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
String 的擴(kuò)展方法
模板字符串(★★★)
ES6新增的創(chuàng)建字符串的方式返吻,使用反引號(hào)定義
let name = `zhangsan`;
模板字符串中可以解析變量
let name = '張三';
let sayHello = `hello,my name is ${name}`; // hello, my name is zhangsan
模板字符串中可以換行
let result = {
name: 'zhangsan',
age: 20,
sex: '男'
}
let html = ` <div>
<span>${result.name}</span>
<span>${result.age}</span>
<span>${result.sex}</span>
</div> `;
在模板字符串中可以調(diào)用函數(shù)
const sayHello = function () {
return '哈哈哈哈 追不到我吧 我就是這么強(qiáng)大';
};
let greet = `${sayHello()} 哈哈哈哈`;
console.log(greet); // 哈哈哈哈 追不到我吧 我就是這么強(qiáng)大 哈哈哈哈
實(shí)例方法:startsWith() 和 endsWith()
- startsWith():表示參數(shù)字符串是否在原字符串的頭部,返回布爾值
- endsWith():表示參數(shù)字符串是否在原字符串的尾部乎婿,返回布爾值
let str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
實(shí)例方法:repeat()
repeat方法表示將原字符串重復(fù)n次测僵,返回一個(gè)新字符串
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
Set 數(shù)據(jù)結(jié)構(gòu)
ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set。它類似于數(shù)組谢翎,但是成員的值都是唯一的捍靠,沒有重復(fù)的值。
Set本身是一個(gè)構(gòu)造函數(shù)森逮,用來生成 Set 數(shù)據(jù)結(jié)構(gòu)
const s = new Set();
Set函數(shù)可以接受一個(gè)數(shù)組作為參數(shù)榨婆,用來初始化。
const set = new Set([1, 2, 3, 4, 4]);//{1, 2, 3, 4}
實(shí)例方法
- add(value):添加某個(gè)值良风,返回 Set 結(jié)構(gòu)本身
- delete(value):刪除某個(gè)值谊迄,返回一個(gè)布爾值,表示刪除是否成功
- has(value):返回一個(gè)布爾值烟央,表示該值是否為 Set 的成員
- clear():清除所有成員统诺,沒有返回值
const s = new Set();
s.add(1).add(2).add(3); // 向 set 結(jié)構(gòu)中添加值
s.delete(2) // 刪除 set 結(jié)構(gòu)中的2值
s.has(1) // 表示 set 結(jié)構(gòu)中是否有1這個(gè)值 返回布爾值
s.clear() // 清除 set 結(jié)構(gòu)中的所有值
//注意:刪除的是元素的值,不是代表的索引
遍歷
Set 結(jié)構(gòu)的實(shí)例與數(shù)組一樣疑俭,也擁有forEach方法粮呢,用于對(duì)每個(gè)成員執(zhí)行某種操作,沒有返回值钞艇。
s.forEach(value => console.log(value))