1、let
ES6中新增的用於聲明變量的關鍵字。
let 聲明的變量只在所處於的塊級有效。
注意:使用 let 關鍵字聲明的變量才具有塊級作用域,var 關鍵字是不具備這個特點的。
1. 防止循環變量變成全局變量。
2. 不存在變量提升
3. 暫時性死區
if(true){
let a=10;
}
console.log(a); // a is not defined
//防止循環變量變成全局變量
for(var i=0;i<2;i++){
}
console.log(i); // i=2(只有i=2時,不滿足for循環條件,即執行下面語句),如果 for循環中使用 let 那么輸入i就會報錯: i is not defined
//let不存在變量提升
console.log(a); //a is not defined
let a = 10;
//暫時性死區
var num = 10;
if(true){
console.log(num);
let num = 20; //只要在塊級區域聲明了變量let,那么這個塊級區域就被let所綁定,所以在塊級里面使用的 num 跟外面定義的全局變量 num 沒有關系
}
2、const
作用:聲明常量,常量就是值(內存地址)不能變化的量
1.const關鍵字
1.具有塊級作用域
2. 聲明常量必須賦初始值
3. 變量賦值后,值不能修改(兩種情況)
1. 基本數據類型:一旦賦值,值就不能修改(比如:數值,字符串)
2. 復雜數據類型:不能賦值,但是可以修改 數據結構內部的值(比如:數組,對象)
const PI = 3.14;
// PI = 100;會報錯(聲明常量時丟失了初始值)
const arr =[100,200];
arr[0]=123; //可以修改數組內元素的值,如果重新賦值是不允許的
arr=[1,2]; //會報錯 因為 arr 重新賦值,改變了內存地址
3、let、const、var的區別
1. 使用 var 聲明的變量,其作用域為該語句所在的函數內,且存在變量提升現象。
2. 使用 let 聲明的變量,其作用域為該語句所在的代碼塊內,不存在變量提升。
3. 使用 const 聲明的常量,在后面出現的代碼中不能再修改該常量的值。
如果聲明的值不需要變化,就用const,這樣JavaScript 解析引擎不用時時監控值的變化,所以效率比 let 高。
4、解構賦值(方便從數組和對象中提取值)
解構:分解數據結構;賦值:指的是為變量賦值。
ES6中允許從數組中提取值,按照對應位置,對變量賦值。對象也可以實現解構。
如果變量沒有對應的值,那么變量的值則是 undefined
1. 數組解構:
數組解構允許我們按照一一對應的關系從數組中提取值,然后將值賦值給變量。
let[a,b,c]=[1,2,3];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
2. 對象解構:
實際上是屬性匹配,對象解構允許我們使用變量的名字匹配對象的屬性,匹配成功將對象屬性的值賦值給變量。
寫法一:(變量和對象中的屬性名一致)
let {name,age,sex} = {name:"andy",age:18,sex:"女"};
console.log(name); // 'andy'
console.log(age); //18
寫法二:(變量名字和對象中屬性名字不一致)
let{name:myName,age:myAge}={name:"andy",age:18}; //myName,myAge 屬於別名
console.log(myName); // 'andy'
console.log(myAge); //18
5、箭頭函數
ES6中新定義函數的方式
1. 語法:
() => { }
():放置形參
{ }:函數體
const fn = () => { } // 通常把函數賦值給一個變量(常量),使用時,直接調用變量(常量)名
2. 箭頭函數中,如果函數體中只有一句代碼,並且代碼的執行結果就是函數的返回值,函數體大括號可以省略,return也可以省略。
const sum = (n1,n2) => n1+n2;
console.log(sum(1,2)); // 3
3. 形參只有一個,可以省略小括號
function fn( num ){
return num;
}
const fn = num => num;
4. 箭頭函數不綁定 this ,箭頭函數沒有自己的 this 關鍵字,
如果在箭頭函數中使用 this,this關鍵字將指向箭頭函數定義作用域中的 this。
function fn(){
console.log(this); //this指的是obj
return () =>{
console.log(this); // 因為箭頭函數不綁定this,箭頭函數中的this指向函數定義位置中的this,所以this指向obj
}
}
const obj ={name:'andy'};
const resFn = fn.call(obj); // 使用call方法,把fn的this指向obj對象
resFn(); //調用的是fn中的匿名函數
箭頭函數面試題
var age = 100;
var obj = {
age:20,
say:() => {
alert(this.age); //100;
}
}
obj.say();
關鍵點:obj是對象,沒有作用域,say方法實際被定義在全局作用域下,say方法中的this指向是window,所以彈出就是window下面的age
6、剩余參數
1. 剩余參數語法允許我們將一個不定數量的參數表示為一個數組
function sum(first,...args){
console.log(first); // 10
console.log(args); // [20,30]
}
sum(10,20,30);
2. 剩余參數和解構函數配合使用
let [s1,...s2] = ['lisi','wangwu','zhangsan'];
console.log(s1); //' lisi '
console.log(s2); //['wangwu','zhangsan']
7、ES6的內置對象擴展
7.1. Array 的擴展方法
擴展運算符(展開語法) :可以將數組或者對象轉為用逗號分隔的參數序列。(和剩余參數用法相反)
let ary = [1,2,3];
...ary // 1,2,3
console.log(...ary); //1 2 3 打印時,會把 1,2,3 以 逗號(,)作為分隔符輸出,所以輸出時是沒有逗號的。
2. 擴展運算符可以應用於合並數組
方法一
let ary1 = [1,2,3];
let ary2 = [4,5,6];
let ary3 = [...ary1,...ary2];
方法二
ary1.push(...ary2);
3. 將類(偽)數組或可遍歷對象轉換為真正的數組(方便調用數組中的方法)。
方式一
let oDivs = document.getElementsByTagName('div'); // 獲取 div 元素集合
oDivs = [...oDivs]; // 轉換為數組序列,在數組序列外用 [ ] 包裹起來,就轉換為真正的數組了
方式二
構造函數方法:Array.from( )
將類(偽)數組或可遍歷對象轉換為真正的數組
let arrayLike = {
'0':'a',
'1':'b',
'2':'c'
};
let arr2 = Array.form(arrayLike); //['a','b','c']
2. 方法還可以接受第二個參數,作用類似於數組的map方法,用來對每個元素進行處理,將處理后的值放入返回的數組。
let arrayLike = {
'0':1,
'1':2
}
let newAry = Array.from(arrLike,function(item){
return item * 2;
});
console.log(newAry); // 2,4
4. 實例方法:find()
用來找出第一個符合條件的數組成員,如果沒有找到返回 undefined
var arr=[{
id:1,
name:'張三'
},{
id:2,
name:'李四'
}];
let target = arr.find(item => item.id==2);
console.log(target);
5. 實例方法:findIndex()
用於找出第一個符合條件的數組成員的位置,如果沒有找到返回 -1
let arg = [1,5,3,10,4,7];
let index = arg.findIndex(value => value>6);
console.log(index); // 3
6. 實例方法:includes()
表示某個數組是否包含給定的值,返回布爾值。
var arr = [1,2,3];
arr.includes(2);//true
arr.includes(0);//false
7.2. String 的擴展方法
模板字符串(`)(tab鍵上面的按鍵)
ES6新增的創建字符串的方式,使用反引號定義。
語法:
let name = `zhangsan`;
2. 可以解析變量
let name ="zhangsan";
let sayHello =`hello,my name is ${name}`; //hello,my name is zhangsan
3. 可以換行
let result ={
name:'張三',
age:18,
sex:'男'
}
let html=`
<div>
<span>${result.name}</span>
<span>${result.age}</span>
<span>${result.sex}</sapn>
</div>
`;
4. 可以調用函數
const fn =function(){
return '函數';
}
let greet = `模板 ${fn()}`; //在調用函數的位置會顯示函數的返回值
console.log(greet); //模板 函數
5. 實例方法: startsWith() 和 endsWith()
startsWith():表示參數字符串是否在原字符串的頭部,返回布爾值
endsWith():表示參數字符串是否在原字符串的尾部,返回布爾值
let str = 'Hello world';
str.startsWith('hello'); //false
str.endsWith('world'); //true
6. 實例方法:repeat()
repeat 方法表示將原字符串重復 n 次,返回一個新字符串
'x'.repeat(3); // xxx
'hello'.repeat(2); //hellohello
7.3 Set 數據結構
ES6 提供了新的數據結構 set,類似於數組,但是成員的值都是唯一的,沒有重復的值。
Set 本身就是一個構造函數,用來生成Set數據結構。
語法:
const set = new Set();
2. Set 函數可以接受一個數組作為參數,用來初始化。
size:實例對象中的屬性,表示在當前數據結構中有多少值
const set = new Set([1,2,3,4,5]);
console.log(set.size); //5
3.利用 Set 數據結構做數組去重
const s1 = new Set([1,2,3,2,4,3,1,4]); //set 會把數據重復的自動去除
console.log(s1.size); //4
// ...s1 1,2,3,4
const newS1=[...s1]; //[1,2,3,4]
4. 實例方法
add(value):添加某個值,返回 Set 結構本身
delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功
has(value):返回一個布爾值,表示改制是否為Set的成員
clear():清除所有成員,沒有返回值
const s =new Set();
s.add(1).add(2).add(3); //向 set 結構中添加值
s.delete(2); // 刪除 set 結構中的 2 值
s.has(1); // 表示 set 結構中是否有 1 這個值,返回布爾值
s.clear(); //清除 set 結構中的所有值
5. 遍歷
Set 結構的實例與數組一樣,也擁有forEach方法,用於對每個成員執行某種操作,沒有返回值。
語法:
s.forEach(val=>console.log(val));
遍歷set數據結構,從中取值
const s1 = new Set(['1','a','e','3']);
s1.forEach(val=>console.log(val)); //1 a e 3