ES6 常用語法

1.新的聲明方式

字面理解ES6的三種聲明方式:

  • var 它是variable的簡寫,可以理解成變量的意思。
  • let 它在英文中是“讓”的意思,也可以理解為一種聲明的意思。
  • const 它在英文中也是常量的意思,在ES6也是用來聲明常量的,常量你可以簡單理解為不變的量。

2.變量的解構賦值

  • 數(shù)組的解構賦值:

以前,為變量賦值,我們只能直接指定值。比如下面的代碼:

let a=0;
let b=1;
let c=2;

而現(xiàn)在我們可以用數(shù)組解構的方式來進行賦值。

let  [a,b,c]=[1,2,3];

上面的代碼表示,可以從數(shù)組中提取值,按照位置的對象關系對變量賦值。

  • 數(shù)組模式和賦值模式統(tǒng)一

可以簡單的理解為等號左邊和等號右邊的形式要統(tǒng)一,如果不統(tǒng)一解構將失敗。

let [a,[b,c],d]=[1,[2,3],4];

如果等號兩邊形式不一樣,很可能獲得undefined或者直接報錯。

  • 解構的默認值

解構賦值是允許你使用默認值的,先看一個最簡單的默認是的例子。

let [foo = true] =[];
console.log(foo); //控制臺打印出true

上邊的例子數(shù)組中只有一個值,可能你會多少有些疑惑,我們就來個多個值的數(shù)組,并給他一些默認值。

let [a,b="天天向上"]=['好好學習']
console.log(a+b); //控制臺顯示“好好學習天天向上”

現(xiàn)在我們對默認值有所了解,需要注意的是undefined和null的區(qū)別。

let [a,b="天天向上"]=['好好學習',undefined];
console.log(a+b); //控制臺顯示“好好學習天天向上”

undefined相當于什么都沒有,b是默認值。

let [a,b="天天向上"]=['好好學習',null];
console.log(a+b); //控制臺顯示“好好學習null”

null相當于有值,但值為null。所以b并沒有取默認值,而是解構成了null。

  • 對象的解構賦值

解構不僅可以用于數(shù)組,還可以用于對象。

let {foo,bar} = {foo:'好好學習',bar:'天天向上'};
console.log(foo+bar); //控制臺打印出了“好好學習天天向上”

注意:對象的解構與數(shù)組有一個重要的不同。數(shù)組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。

  • 圓括號的使用

如果在解構之前就定義了變量,這時候你再解構會出現(xiàn)問題。下面是錯誤的代碼,編譯會報錯。

let foo;
{foo} = {foo:'好好學習'};
console.log(foo);

要解決報錯,使程序正常,我們這時候只要在解構的語句外邊加一個圓括號就可以了。

let foo;
({foo} ={foo:'好好學習'});
console.log(foo); // 好好學習
  • 字符串解構

字符串也可以解構,這是因為,此時字符串被轉換成了一個類似數(shù)組的對象。

const [a,b,c,d,e,f]="好好學習";
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
console.log(f);

3.擴展運算符和rest運算符

  • 對象擴展運算符(…)

當編寫一個方法時,我們允許它傳入的參數(shù)是不確定的。這時候可以使用對象擴展運算符來作參數(shù),看一個簡單的列子:

function fun(...arg){
    console.log(arg[0]);
    console.log(arg[1]);
    console.log(arg[2]);
    console.log(arg[3]);

}
fun(1,2,3);

這時我們看到控制臺輸出了 1,2,3,undefined,這說明是可以傳入多個值,并且就算方法中引用多了也不會報錯。

  • 擴展運算符的用處

我們先用一個例子說明,我們聲明兩個數(shù)組arr1和arr2,然后我們把arr1賦值給arr2,然后我們改變arr2的值,你會發(fā)現(xiàn)arr1的值也改變了,因為我們這是對內存堆棧的引用,而不是真正的賦值。

let arr1=['www','baidu','com'];
let arr2=arr1;
console.log(arr2); 
arr2.push('Google');
console.log(arr1);

控制臺輸出:

["www", "baidu", "com"]
["www", "baidu", "com", "Google"]

這是我們不想看到的,可以利用對象擴展運算符簡單的解決這個問題,現(xiàn)在我們對代碼進行改造。

let arr1=['www','baidu','com'];
//let arr2=arr1;
let arr2=[...arr1];
console.log(arr2);
arr2.push('Google');
console.log(arr2);
console.log(arr1);

現(xiàn)在控制臺預覽時,你可以看到我們的arr1并沒有改變,簡單的擴展運算符就解決了這個問題。

  • rest運算符

如果你已經很好的掌握了對象擴展運算符,那么理解rest運算符并不困難,它們有很多相似之處,甚至很多時候你不用特意去區(qū)分。它也用…(三個點)來表示,我們先來看一個例子。

function fun(first,...arg){
    console.log(arg.length);
}

fun(0,1,2,3,4,5,6,7);

這時候控制臺打印出了7,說明我們arg里有7個數(shù)組元素,這就是rest運算符的最簡單用法。

  • 如何循環(huán)輸出rest運算符

這里我們用for…of循環(huán)來進行打印出arg的值。

function fun(first,...arg){
    for(let val of arg){
        console.log(val);
    }
}

fun(0,1,2,3,4,5,6,7);

4.字符串模版

  • 字符串模版

先來看一個在ES5下我們的字符串拼接案例:

let skill='js';
let blog = '我是一名前端工程師,我會 '+skill;
document.write(blog);

ES5下必須用+skill這樣的形式進行拼接,這樣很麻煩而且很容易出錯。ES6新增了字符串模版,可以很好的解決這個問題。字符串模版不再使用‘xxx’這樣的單引號,而是換成了xxx這種形式,也叫連接號。這時我們再引用skill變量就需要用${skill}這種形式了,我們對上邊的代碼進行改造。

let skill='js';
let blog = `我是一名前端工程師,我會${skill}`;
document.write(blog);

可以看到瀏覽器出現(xiàn)了和上邊代碼一樣的結果。而且這里邊支持html標簽,可以試著輸入一些。

  • 對運算的支持
let a=1;
let b=2;
let result=`${a+b}`;
document.write(result);

字符串查找

  • 查找是否存在
//es5 中
let skill='js';
let blog = `我是一名前端工程師,我會${skill}`;
document.write(blog.indexOf(skill));

這是網頁中輸出了12,我們還要自己判斷。

ES6直接用includes就可以判斷,不再返回索引值,這樣的結果我們更喜歡,更直接。

let skill='js';
let blog = `我是一名前端工程師,我會${skill}`;
document.write(blog.includes(skill));
  • 判斷開頭是否存在
blog.startsWith(skill);
  • 判斷結尾是否存在
blog.endsWith(skill)

需要注意的是:starts和ends 后邊都要加s。

  • 復制字符串

我們有時候是需要字符串重復的,比如分隔符和特殊符號,這時候復制字符串就派上用場了,語法很簡單。

document.write('skill|'.repeat(3));

5.ES6的數(shù)組

  • JSON數(shù)組格式轉換
let  json = {
    '0': '好好學習',
    '1': '天天向上',
    '2': '努力工作',
    length:3
}

這就是一個標準的JSON數(shù)組格式,跟普通的JSON對比是在最后多了一個length屬性。只要是這種特殊的json格式都可以輕松使用ES6的語法轉變成數(shù)組。在ES6中絕大部分的Array操作都存在于Array對象里。我們就用Array.from(xxx)來進行轉換。我們把上邊的JSON代碼轉換成數(shù)組,并打印在控制臺。

let  json = {
    '0': '好好學習',
    '1': '天天向上',
    '2': '努力工作',
    length:3
}

let arr=Array.from(json);
console.log(arr)

實際開發(fā)中這種方法還是比較常用的,畢竟節(jié)省了我們代碼行數(shù),也讓我們的程序更清晰。

  • Array.of()

它負責把一堆文本或者變量轉換成數(shù)組。在開發(fā)中我們經常拿到了一個類似數(shù)組的字符串,需要使用eval來進行轉換,如果你一個老手程序員都知道eval的效率是很低的,它會拖慢我們的程序。這時候我們就可以使用Array.of方法。我們看下邊的代碼把一堆數(shù)字轉換成數(shù)組并打印在控制臺上:

let arr =Array.of(3,4,5,6);
console.log(arr);

當然它不僅可以轉換數(shù)字,字符串也是可以轉換的,看下邊的代碼:

let arr =Array.of('好好學習','天天向上','努力工作');
console.log(arr);
  • find()

所謂的實例方法就是并不是以Array對象開始的,而是必須有一個已經存在的數(shù)組,然后使用的方法,這就是實例方法(不理解請看下邊的代碼,再和上邊的代碼進行比對,你會有所頓悟)。這里的find方法是從數(shù)組中查找。在find方法中我們需要傳入一個匿名函數(shù),函數(shù)需要傳入三個參數(shù):

  1. value:表示當前查找的值。
  2. index:表示當前查找的數(shù)組索引。
  3. arr:表示當前數(shù)組。

在函數(shù)中如果找到符合條件的數(shù)組元素就進行return,并停止查找。你可以拷貝下邊的代碼進行測試,就會知道find作用。

let arr=[1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
    return value > 5;
}))
  • fill( )

fill()也是一個實例方法,它的作用是把數(shù)組進行填充,它接收三個參數(shù),第一個參數(shù)是填充的變量,第二個是開始填充的位置,第三個是填充到的位置。

let arr=[0,1,2,3,4,5,6,7,8,9];
arr.fill('好好學習',2,5);//把數(shù)組從第二位到第五位用“好好學習”進行填充
console.log(arr);//[0, 1, "好好學習", "好好學習", "好好學習", 5, 6, 7, 8, 9]

上邊的代碼是把數(shù)組從第二位到第五位用“好好學習”進行填充。

  • for…of循環(huán)

這種形式比ES5的for循環(huán)要簡單而且高效。先來看一個最簡單的for…of循環(huán)

let arr=['好好學習','天天向上','努力工作']

for (let item of arr){
    console.log(item);
}
//好好學習
//天天向上
//努力工作

for…of數(shù)組索引:有時候開發(fā)中是需要數(shù)組的索引的,那我們可以使用下面的代碼輸出數(shù)組索引。

let arr=['好好學習','天天向上','努力工作']
for (let index of arr.keys()){
    console.log(index);
}

可以看到這時的控制臺就輸出了0,1,2,也就是數(shù)組的索引。

同時輸出數(shù)組的內容和索引:我們用entries()這個實例方法,配合我們的for…of循環(huán)就可以同時輸出內容和索引了。

let arr=['好好學習','天天向上','努力工作']
for (let [index,val] of arr.entries()){
    console.log(index+':'+val);
}
  • entries( )

entries()實例方式生成的是Iterator形式的數(shù)組,那這種形式的好處就是可以讓我們在需要時用next()手動跳轉到下一個值。我們來看下面的代碼:

let arr=['好好學習','天天向上','努力工作']
let list=arr.entries();
console.log(list.next().value);
console.log(list.next().value);
console.log(list.next().value);
6. ES6中的箭頭函數(shù)和擴展

之前我們寫函數(shù):

function add(a,b){
    return a+b;
}
console.log(add(1,2));

我們聲明了一個add函數(shù),然后傳入a和b兩個值,返回a+b的值。 然后我們在控制臺打印了這個函數(shù)的返回結果,這里是3.

  • 默認值

在ES6中給我們增加了默認值的操作,我們修改上邊的代碼,可以看到現(xiàn)在只需要傳遞一個參數(shù)也是可以正常運行的。

function add(a,b=2){
    return a+b;
}
console.log(add(1));//3
  • 主動拋出錯誤
    在使用Vue的框架中,可以經??吹娇蚣苤鲃訏伋鲆恍╁e誤,比如v-for必須有:key值。那尤大神是如何做到的那?其實很簡單,ES6中我們直接用throw new Error( xxxx ),就可以拋出錯誤。
function add(a,b=1){

    if(a == 0){
        throw new Error('This is error')
    }
     return a+b;
}

console.log(add(0));
  • 函數(shù)中的嚴謹模式

我們在ES中就經常使用嚴謹模式來進行編程,但是必須寫在代碼最上邊,相當于全局使用。在ES6中我們可以寫在函數(shù)體中,相當于針對函數(shù)來使用。

function add(a,b=1){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
}

console.log(add(1));

上邊的代碼如果運行的話,你會發(fā)現(xiàn)瀏覽器控制臺報錯,這是ES6中的一個坑,這個錯誤的原因就是如果你使用了默認值,再使用嚴謹模式的話,就會有沖突,所以我們要取消默認值的操作,這時候你在運行就正常了。

  • 獲得需要傳遞的參數(shù)個數(shù)

如果你在使用別人的框架時,不知道別人的函數(shù)需要傳遞幾個參數(shù)怎么辦?ES6為我們提供了得到參數(shù)的方法(xxx.length).我們用上邊的代碼看一下需要傳遞的參數(shù)個數(shù)。

function add(a,b){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
}

console.log(add.length);

這時控制臺打印出了2,但是如果我們去掉嚴謹模式,并給第二個參數(shù)加上默認值的話,這時候add.length的值就變成了1, 也就是說它得到的是必須傳入的參數(shù)。

箭頭函數(shù)

改造一下之前學的add函數(shù),寫成箭頭函數(shù)

var add =(a,b=1) => a+b;
console.log(add(1));
  • {}的使用

在箭頭函數(shù)中,方法體內如果是兩句話,那就需要在方法體外邊加上{}括號。例如下邊的代碼就必須使用{}.

var add =(a,b=1) => {
    console.log('111111')
    return a+b;
};
console.log(add(1));

箭頭函數(shù)中不可加new,也就是說箭頭函數(shù)不能當構造函數(shù)進行使用。

7. ES6中的函數(shù)和數(shù)組補漏
  • 對象的函數(shù)解構

我們在前后端分離時,后端經常返回來JSON格式的數(shù)據,前端的美好愿望是直接把這個JSON格式數(shù)據當作參數(shù),傳遞到函數(shù)內部進行處理。ES6就為我們提供了這樣的解構賦值。

let json = {
    a:'好好學習',
    b:'天天向上'
}
function fun({a,b='努力工作'}){
    console.log(a,b);
}
fun(json);//好好學習 天天向上

  • 數(shù)組的函數(shù)解構

函數(shù)能解構JSON,那解構我們的數(shù)組就更不在話下了,我們看下邊的代碼。我們聲明一個數(shù)組,然后寫一個方法,最后用…進行解構賦值。

let arr = ['好好學習','天天向上','努力工作'];
function fun(a,b,c){
    console.log(a,b,c);
}

fun(...arr);
  • in

in是用來判斷對象或者數(shù)組中是否存在某個值的。我們先來看一下用in如何判斷對象里是否有某個值。

對象判斷

let obj={
    a:'好好學習',
    b:'天天向上'
}
console.log('a' in obj); //true
  • 數(shù)組判斷

先來看一下ES5判斷的弊端,以前會使用length屬性進行判斷,為0表示沒有數(shù)組元素。但是這并不準確,或者說真實開發(fā)中有弊端。

let arr=[,,,,,];
console.log(arr.length); //5

上邊的代碼輸出了5,但是數(shù)組中其實全是空值,這就是一個坑啊。那用ES6的in就可以解決這個問題。

let arr=[,,,,,];
console.log(0 in arr); //false

let arr1=['好好學習','天天向上'];
console.log(0 in arr1);  // true

注意:這里的0指的是數(shù)組下標位置是否為空。

  • 數(shù)組的遍歷方法

1.forEach

let arr=['好好學習','天天向上','努力工作'];

arr.forEach((val,index)=>console.log(index,val));

2.filter

let arr=['好好學習','天天向上','努力工作'];

arr.filter(x=>console.log(x));

3.some

let arr=['好好學習','天天向上','努力工作'];

arr.some(x=>console.log(x));

4.map

let arr=['好好學習','天天向上','努力工作'];

console.log(arr.map(x=>'web'));

map在這里起到一個替換的作用,這個我們后續(xù)課程會詳細講解。

5.join()

let arr=['好好學習','天天向上','努力工作'];

console.log(arr.join('|'));

6.toString()

let arr=['好好學習','天天向上','努力工作'];

console.log(arr.toString());

8.ES6中對象

  • 對象賦值

ES6允許把聲明的變量直接賦值給對象,我們看下面的例子。

let name="xiaoxianxian";
let skill= 'web';
var obj= {name,skill};
console.log(obj);  //Object {name: "xiaoxianxian", skill: "web"}
  • 對象Key值構建

有時候我們會在后臺取出key值,而不是我們前臺定義好的,這時候我們如何構建我們的key值那。比如我們在后臺取了一個key值,然后可以用[ ] 的形式,進行對象的構建。

let key='skill';
var obj={
    [key]:'web'
}
console.log(obj.skill);

自定義對象方法

var obj={
    add:function(a,b){
        return a+b;
    }
}
console.log(obj.add(1,2));  //3
  • Object.is( ) 對象比較

對象的比較方法,以前進行對象值的比較,經常使用===來判斷,比如下面的代碼:

var obj1 = {name:'xiaoxianxian'};
var obj2 = {name:'xiaoxianxian'};
console.log(obj1.name === obj2.name);//true

那ES6為我們提供了is方法進行對比。

var obj1 = {name:'xiaoxianxian'};
var obj2 = {name:'xiaoxianxian'};
console.log(obj1.name === obj2.name);//true
console.log(Object.is(obj1.name,obj2.name)); //true

區(qū)分=== 和 is方法的區(qū)別是什么,看下面的代碼輸出結果。

console.log(+0 === -0);  //true
console.log(NaN === NaN ); //false
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true

"===為同值相等,is()為嚴格相等。"

  • Object.assign( )合并對象

操作數(shù)組時我們經常使用數(shù)組合并,那對象也有合并方法,那就是assgin( )。看一下啊具體的用法。

var a={a:'好好學習'};
var b={b:'天天向上'};
var c={c:'努力工作'};

let d=Object.assign(a,b,c)
console.log(d);

9.Symbol在對象中的作用

  • 聲明Symbol
var a = new String;
var b = new Number;
var c = new Boolean;
var d = new Array;
var e = new Object; 
var f= Symbol();
console.log(typeof(d));
  • Symbol的打印

我們先聲明一個Symbol,然后我們在控制臺輸出一下。

var g = Symbol('web');
console.log(g);
console.log(g.toString());

這時候我們仔細看控制臺是有區(qū)別的,沒有toString的是紅字,toString的是黑字。

  • Symbol在對象中的應用
var xx = Symbol();
var obj={
    [xx]:'前端開發(fā)'
}
console.log(obj[xx]);
obj[xx]='web';
console.log(obj[xx]);
  • Symbol對象元素的保護作用
    在對象中有很多值,但是循環(huán)輸出時,并不希望全部輸出,那我們就可以使用Symbol進行保護

沒有進行保護的寫法:

var obj={name:'xiaoxianxian',skill:'web',age:18};

for (let item in obj){
    console.log(obj[item]);
}

現(xiàn)在我不想別人知道我的年齡,這時候我就可以使用Symbol來進行循環(huán)保護。

let obj={name:'xiaoxianxian',skill:'web'};
let age=Symbol();
obj[age]=18;
for (let item in obj){
    console.log(obj[item]);
} 
console.log(obj);

9.Set和WeakSet數(shù)據結構

  • set的聲明
let setArr = new Set(['好好學習','天天向上']);
console.log(setArr);//Set {'好好學習','天天向上'}

Set和Array 的區(qū)別是Set不允許內部有重復的值,如果有只顯示一個,相當于去重。雖然Set很像數(shù)組,但是他不是數(shù)組。

  • Set值的增刪查

追加add

在使用Array的時候,可以用push進行追加值,那Set稍有不同,它用更語義化的add進行追加。

let setArr = new Set(['好好學習','天天向上']);
console.log(setArr);//Set {'好好學習','天天向上'}

setArr.add('前端職場');
console.log(setArr);

刪除delete

let setArr = new Set(['好好學習','天天向上']);
console.log(setArr);//Set {'好好學習','天天向上'}

setArr.add('前端職場');
console.log(setArr); //Set {'好好學習','天天向上', "前端職場"}

setArr.delete('前端職場');
console.log(setArr); //Set {'好好學習','天天向上'}

查找has

用has進行值的查找,返回的是true或者false。

let setArr = new Set(['好好學習','天天向上']);
console.log(setArr);//Set {'好好學習','天天向上'}

console.log(setArr.has('好好學習'));//true

刪除clear

let setArr = new Set(['好好學習','天天向上']);
console.log(setArr);//Set {'好好學習','天天向上'}
setArr.clear();

console.log(setArray);//true

set的循環(huán) for…of…循環(huán)

let setArr = new Set(['好好學習','天天向上']);
for (let item of setArr){
    console.log(item);
}

size屬性 size屬性可以獲得Set值的數(shù)量。

let setArr = new Set(['好好學習','天天向上']);
for (let item of setArr){
    console.log(item);
}

console.log(setArr.size);

forEach循環(huán)

let setArr = new Set(['好好學習','天天向上']);
setArr.forEach((value)=>console.log(value));
  • WeakSet的聲明
let weakObj=new WeakSet();
let obj={a:'好好學習',b:'天天向上'}
weakObj.add(obj);

console.log(weakObj);

這里需要注意的是,如果你直接在new 的時候就放入值,將報錯。

WeakSet里邊的值也是不允許重復的,我們來測試一下。

let weakObj=new WeakSet();
let obj={a:'好好學習',b:'天天向上'}
let obj1=obj;

weakObj.add(obj);
weakObj.add(obj1);

console.log(weakObj);

10.map數(shù)據結構

  • Json和map格式的對比
let json = {
    name:'xiaoxianxian',
    skill:'web'
}
console.log(json.name);

但是這種反應的速度要低于數(shù)組和map結構。而且Map的靈活性要更好,你可以把它看成一種特殊的鍵值對,但你的key可以設置成數(shù)組,值也可以設置成字符串,讓它不規(guī)律對應起來。

let json = {
    name:'xiaoxianxian',
    skill:'web'
}
console.log(json.name);

var map=new Map();
map.set(json,'iam');
console.log(map);

當然也可key字符串,value是對象。我們調換一下位置,依然是符合map的數(shù)據結構規(guī)范的。

map.set('xiaoxianxian',json);
console.log(map);
  • 取值get

現(xiàn)在取json對應的值。

console.log(map.get(json));
  • 刪除delete

刪除delete的特定值:

map.delete(json);
console.log(map)
  • size屬性
console.log(map.size);

  • 查找是否存在has
consolec .log(map.has('xiaoxianxian'))

  • 清楚所有元素clear
map.clear()

11.用Proxy進行預處理

先了解一個概念“鉤子函數(shù)”:當我們在操作一個對象或者方法時會有幾種動作,比如:在運行函數(shù)前初始化一些數(shù)據,在改變對象值后做一些善后處理。這些都算鉤子函數(shù)。

Proxy的存在就可以讓我們給函數(shù)加上這樣的鉤子函數(shù),你也可以理解為在執(zhí)行方法前預處理一些代碼。你可以簡單的理解為他是函數(shù)或者對象的生命周期。

在學習新知識之前,先來回顧一下定義對象的方法。

var obj={
    add:function(val){
        return val+10;
    },
    name:'I am xiaoxianxian'

};
console.log(obj.add(100));
console.log(obj.name);
  • 聲明Proxy

我們用new的方法對Proxy進行聲明??梢钥匆幌侣暶鱌roxy的基本形式。new Proxy({},{});

需要注意的是這里是兩個花括號,第一個花括號就相當于我們方法的主體,后邊的花括號就是Proxy代理處理區(qū)域,相當于我們寫鉤子函數(shù)的地方。

現(xiàn)在把上邊的obj對象改成我們的Proxy形式。

var pro = new Proxy({
    add: function (val) {
        return val + 10;
    },
    name: 'I am xiaoxianxian'
}, 
{
    get:function(target,key,property){
        console.log('come in Get');
        return target[key];
    }
});

console.log(pro.name);

可以在控制臺看到結果,先輸出了come in Get。相當于在方法調用前的鉤子函數(shù)。

  • get屬性

get屬性是在你得到某對象屬性值時預處理的方法,他接受三個參數(shù)

target:得到的目標值

key:目標的key值,相當于對象的屬性

property:這個不太常用,用法還在研究中,還請大神指教。
  • set屬性

set屬性是值你要改變Proxy屬性值時,進行的預先處理。它接收四個參數(shù)。

target:目標值。
key:目標的Key值。
value:要改變的值。
receiver:改變前的原始值。
var pro = new Proxy({
    add: function (val) {
        return val + 10;
    },
    name: 'I am xiaoxianxian'
}, 
{
    get:function(target,key){
        console.log('come in Get');
        return target[key];
    },
    set:function(target,key,value,receiver){
        console.log(`    setting ${key} = ${value}`);
        return target[key] = value;
    }

});

console.log(pro.name);
pro.name='xiaoxianxian';
console.log(pro.name);
  • apply的使用

apply的作用是調用內部的方法,它使用在方法體是一個匿名函數(shù)時??聪逻叺拇a。

get = function () {
    return 'I am xiaoxianxian';
};
var handler = {
    apply(target, ctx, args) {
        console.log('do apply');
        return Reflect.apply(...arguments);
    }
}

var pro = new Proxy(target, handler);

console.log(pro());

proxy的知識是非常多的,這里我建議看阮一峰大神的《ES6》

12.promise對象的使用

  • promise的基本用法

promise執(zhí)行多步操作非常好用,那我們就來模仿一個多步操作的過程,那就以吃飯為例吧。要想在家吃頓飯,是要經過三個步驟的。

1.洗菜做飯。
2.坐下來吃飯。
3.收拾桌子洗碗。

這個過程是有一定的順序的,你必須保證上一步完成,才能順利進行下一步。我們可以在腦海里先想想這樣一個簡單的過程在ES5寫起來就要有多層的嵌套。那我們現(xiàn)在用promise來實現(xiàn)。

let state=1;

function step1(resolve,reject){
    console.log('1.開始-洗菜做飯');
    if(state==1){
        resolve('洗菜做飯--完成');
    }else{
        reject('洗菜做飯--出錯');
    }
}


function step2(resolve,reject){
    console.log('2.開始-坐下來吃飯');
    if(state==1){
        resolve('坐下來吃飯--完成');
    }else{
        reject('坐下來吃飯--出錯');
    }
}


function step3(resolve,reject){
    console.log('3.開始-收拾桌子洗完');
     if(state==1){
        resolve('收拾桌子洗完--完成');
    }else{
        reject('收拾桌子洗完--出錯');
    }
}

new Promise(step1).then(function(val){
    console.log(val);
    return new Promise(step2);

}).then(function(val){
     console.log(val);
    return new Promise(step3);
}).then(function(val){
    console.log(val);
    return val;
});

13.class類的使用

先聲明一個最簡單的coder類,類里只有一個name方法,方法中打印出傳遞的參數(shù)。

class coder{
    name(val){
        console.log(val);
    }
}
  • 類的聲明
    我們已經聲明了一個類,并在類里聲明了name方法,現(xiàn)在要實例化類,并使用類中的方法。
class Coder{
    name(val){
        console.log(val);
    }
}

let xiaoxianxian= new Coder;
xiaoxianxian.name('xiaoxianxian');
  • 類的多方法聲明
class Coder{
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('xiaoxianxian')+':'+'Skill:'+val);
    }
}

let xiaoxianxian= new Coder;
xiaoxianxian.name('xiaoxianxian');
xiaoxianxian.skill('web');

這里需要注意的是兩個方法中間不要寫逗號了,還有這里的this指類本身,還有要注意return 的用法。

  • 類的傳參

在類的參數(shù)傳遞中我們用constructor( )進行傳參。傳遞參數(shù)后可以直接使用this.xxx進行調用。

class Coder{
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('xiaoxianxian')+':'+'Skill:'+val);
    }

    constructor(a,b){
        this.a=a;
        this.b=b;
    }

    add(){
        return this.a+this.b;
    }
}

let xiaoxianxian=new Coder(1,2);
console.log(xiaoxianxian.add());

我們用constructor來約定了傳遞參數(shù),然后用作了一個add方法,把參數(shù)相加。這和以前我們的傳遞方法有些不一樣,所以需要注意下。

  • class的繼承
class htmler extends Coder{

}

let pang=new htmler;
pang.name('xiaoxianxian');

聲明一個htmler的新類并繼承Coder類,htmler新類里邊為空,這時候我們實例化新類,并調用里邊的name方法。結果也是可以調用到的。

14.模塊化操作

在ES5中我們要進行模塊華操作需要引入第三方類庫,隨著前后端分離,前端的業(yè)務日漸復雜,ES6為我們增加了模塊話操作。模塊化操作主要包括兩個方面。

export :負責進行模塊化,也是模塊的輸出。
import : 負責把模塊引,也是模塊的引入操作。

export

export可以讓我們把變量,函數(shù),對象進行模塊話,提供外部調用接口,讓外部進行引用。先來看個最簡單的例子,把一個變量模塊化。我們新建一個temp.js文件,然后在文件中輸出一個模塊變量。

export var a = 'xiaoxianxian';

然后可以在index.js中以import的形式引入。

import {a} from './temp.js';

console.log(a);

這就是一個最簡單的模塊的輸出和引入。

  • 多變量的輸出
    這里聲明了3個變量,需要把這3個變量都進行模塊化輸出,這時候我們給他們包裝成對象就可以了。
var a ='xiaoxianxian';
var b ='xiaoxianxian2';
var c = 'web';

export {a,b,c}

函數(shù)的模塊化輸出

export function add(a,b){
    return a+b;
}

as的用法 有些時候我們并不想暴露模塊里邊的變量名稱,而給模塊起一個更語義話的名稱,這時候我們就可以使用as來操作。

var a ='好好學習';
var b ='天天向上';
var c = 'web';

export {
    x as a,
    y as b,
    z as c
}

export default的使用 加上default相當是一個默認的入口。在一個文件里export default只能有一個。我們來對比一下export和export default的區(qū)別

  • export
export var a ='xiaoxianxian';

export function add(a,b){
    return a+b;
}

對應的導入方式

import {a,add} form './temp';//也可以分開寫

  • export defalut
export default var a='xiaoxianxian';

對應的引入方式

import str from './temp';

ES6的模塊化不能直接在瀏覽器中預覽,必須要使用Babel進行編譯之后正??吹浇Y果。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容