淺析es6新特性

在近期的Vue開發(fā)中闪朱,使用了大量的ES6語法,因此覺得有必要找個(gè)時(shí)間來整理下近期的學(xué)習(xí)筆記钻洒。ES6相對(duì)ES5增加了許多新的特性奋姿,給我們的開發(fā)提供了方便。并且ES6也是未來開發(fā)的潮流素标,所以我覺得大家很有必要去掌握這一技能胀蛮。

在我們正式學(xué)習(xí)ES6前,我們需要先去學(xué)習(xí)下轉(zhuǎn)碼器糯钙。常用的轉(zhuǎn)碼器有Babel和Traceur粪狼。這里推薦一篇常見的ES6轉(zhuǎn)碼工具有興趣的可以去看看。

接下來我們就一起去見證ES6的神奇之處吧任岸!

1.let和const

let與var類似是用來聲明變量的再榄,const用來聲明常量。在實(shí)際用途中它們存在著許多區(qū)別享潜,廢話不多說困鸥,直接看代碼。

  {
      var a = 100;
      let b = 200;
  }
  console.log(a); //100
  console.log(b); //b is not defined -- Error

是不是感覺很奇怪剑按,為什么a有值而b卻not defined呢疾就?因?yàn)镋S5只有全局作用域和函數(shù)作用域,沒有塊級(jí)作用域艺蝴。而let則實(shí)際上為JavaScript新增了塊級(jí)作用域猬腰。用它所聲明的變量,只在let命令所在的代碼塊內(nèi)有效猜敢。

let不存在變量提升姑荷。那么什么是變量提升呢?簡(jiǎn)單來說就是無論聲明在什么地方缩擂,都會(huì)被視為聲明在頂部鼠冕。下面來看個(gè)例子。

//ES5
    console.log("ES5:");
    var a = [];
    for (var i = 0; i < 10; i++) {
        var c = i;
        a[i] = function () {
            console.log(c);
        };
    };
    a[5](); //結(jié)果:9

是不是有許多小伙伴在疑惑為什么輸出的不是5呢胯盯?變量i是var聲明的懈费,在全局范圍內(nèi)都有效。所以每一次循環(huán)博脑,新的i值都會(huì)覆蓋舊值憎乙,導(dǎo)致最后輸出的是最后一輪的i的值薄坏。而使用let則不會(huì)出現(xiàn)這個(gè)問題。

//ES6
    console.log("ES6:");
    var b = [];
    for (var j = 0; j < 10; j++) {
        let d = j;
        b[j] = function () {
            console.log(d);
        };
    };
    b[5](); 結(jié)果://5

同時(shí)let也是不允許重復(fù)聲明的寨闹。

    {
        var a = 100;
        var a = 200;
        console.log(a); //200
    }
    // 模塊內(nèi)部不允許用let命令重復(fù)聲明
    {
        var a = 1;
        let a = 2;
        console.log(a); // 報(bào)錯(cuò)
    }

下面再來說說 const胶坠。const也用來聲明變量,但是聲明的是常量繁堡,一旦聲明沈善,常量的值就不能改變。它和let一樣只在聲明的區(qū)域內(nèi)有用椭蹄。

    {
        var a   = 100;
        const a = 200;
        console.log(a); // 報(bào)錯(cuò)
    }

const聲明對(duì)象

    const person = {};
    person.name  = "Zhangsan";
    person.age   = 30;

    console.log(person.name);   //Zhangsan
    console.log(person.age);    //30
    console.log(person);        //Object {name: "Zhangsan", age: 30}

const對(duì)象凍結(jié)

    const person = Object.freeze({});
    person.name  = "Zhangsan";
    person.age   = 30;

    console.log(person.name);   //undefined
    console.log(person.age);    //undefined
    console.log(person);        //Object

2.模板字符串

相對(duì)于es5的' '+變量這種字符串拼接方法闻牡,es6的模板字符串要方便許多。

     var a = '張三';
     var age = 18;
     var b = '我的名字是'+a+'我今年'+age+'歲了'; // es5
     var c = `我的名字是${a}我今年${age}歲了`; // es6

當(dāng)然簡(jiǎn)單的兩行代碼可能它的優(yōu)勢(shì)沒有那么的明顯绳矩,一旦代碼量變多罩润,你就能體會(huì)到它的便利了。

3.函數(shù)

函數(shù)默認(rèn)參數(shù)
     function num(n) {
        n = n || 200; //當(dāng)傳入n時(shí)翼馆,n為傳入的值割以,沒有則默認(rèn)200
        return n;
     }

es6為參數(shù)提供了默認(rèn)值。在定義函數(shù)時(shí)便初始化了這個(gè)參數(shù)应媚,直接看代碼严沥。

     function num(n = 200) {
        return n;
     }
     console.log(n()); // 200
     console.log(n(100)); // 100
箭頭函數(shù)

箭頭函數(shù)的基本用法。

// es5
     function breakfast(dessert,drink){
        return dessert+drink;
     }
// es6
     let breakfast = (dessert,drink) => dessert + ' ' + drink;
     console.log(breakfast('面包','牛奶'));

箭頭函數(shù)的this指向綁定定義是所在的作用域中姜,而普通函數(shù)this指向運(yùn)行時(shí)所在的作用域(全局對(duì)象)消玄,箭頭函數(shù)沒有自己的this而是引用外層的this。

// es5
     cartView: function() {
          var _this = this;
          this.$http.get("data/cartData.json", {"id": 123}).then(function(res) {
              _this.productList = res.data.result.list;
              console.log(_this.productList);
        });
      }
// es6
      cartView(){
          this.$http.get("data/cartData.json", {"id": 123}).then((res) {
              this.productList = res.data.result.list;
              console.log(this.productList);
        });
      }

4.解構(gòu)

數(shù)組和對(duì)象是JS中最常用也是最重要表示形式丢胚。為了簡(jiǎn)化提取信息翩瓜,ES6新增了解構(gòu),這是將一個(gè)數(shù)據(jù)結(jié)構(gòu)分解為更小的部分的過程携龟。

// es5提取對(duì)象
    let people = {
        name : 'json',
        age : 18,
        sex : 'male'
    }兔跌;
    let name = people.name;
    let age = people.age;
    ...
 // es6
    let people = {
        name : 'json',
        age : 18,
        sex : 'male'
    };
    let {name, age, sex} = people;

相比于es5是不是簡(jiǎn)便了許多骨宠,當(dāng)然數(shù)組的方法與對(duì)象的類似浮定。下面我們?cè)賮砼e個(gè)栗子,函數(shù)參數(shù)解構(gòu)賦值的默認(rèn)值层亿。

    fun ({x, y} = { x: 0, y: 0 }) {
        return [x, y];
    };

    console.log(fun({x: 100, y: 200})); //[100, 200]
    console.log(fun({x: 100}));         //[100, undefined]
    console.log(fun({}));               //[undefined, undefined]
    console.log(fun());                 //[0, 0]

講了這么多,可能有人就會(huì)問了這個(gè)解構(gòu)到底有什么用呢立美?其實(shí)它適合于各種與數(shù)組匿又,對(duì)象,函數(shù)打交道的場(chǎng)景建蹄。下面我們來舉個(gè)運(yùn)用最廣的例子—變量交換碌更。直接上代碼裕偿。

//ES5
    console.log("ES5:");
    var a = 100;
    var b = 200;
    console.log("交換前:");
    console.log("a = " + a);    //a = 100
    console.log("b = " + b);    //b = 200
    var temp;
    temp = a;
    a = b;
    b = temp;
    console.log("交換后:");
    console.log("a = " + a);    //a = 200
    console.log("b = " + b);    //b = 100

    //ES6
    console.log("ES6:");
    var x = 100;
    var y = 200;
    console.log("交換前:");
    console.log("x = " + x);    //x = 100
    console.log("y = " + y);    //y = 200
    [x, y] = [y, x];
    console.log("交換后:");
    console.log("x = " + x);    //x = 200
    console.log("y = " + y);    //y = 100

5. ...操作符

  • 展開操作符
    let str2 = ['蘋果','梨子'];
    console.log(str2);//["蘋果", "梨子"]
    console.log(...str2);//蘋果 梨子
  • 剩余操作符
    fun(a,b,...c){
        console.log(a,b,...c);//...c指展開數(shù)組
    }
    fun('蘋果','香蕉','橘子','梨子','李子');//蘋果 香蕉 橘子 梨子 李子

6.class、 extends痛单、 super

這三個(gè)特性涉及了ES5中最令人頭疼的的幾個(gè)部分:原型嘿棘、構(gòu)造函數(shù),繼承...看到它們是不是開始懷疑人生了旭绒。

別怕有來了ES6我們以后再懷疑吧鸟妙!

ES6提供了更接近傳統(tǒng)語言的寫法,引入了Class(類)這個(gè)概念挥吵。新的class寫法讓對(duì)象原型的寫法更加清晰重父、更像面向?qū)ο缶幊痰恼Z法,也更加通俗易懂忽匈。

class MyClass {
  constructor() {  // 構(gòu)造函數(shù)
    // ...
  }
  get prop() {  // 取值
    return 'getter';
  }
  set prop(value) { // 存值
    console.log('setter: '+value);
  }
}

let inst = new MyClass();
inst.prop = 123;
// setter: 123
console.log(inst.prop);
// 'getter'

extends用法

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}

class ColorPoint extends Point {
  constructor(x, y, color) {
    this.color = color; // ReferenceError
    super(x, y);
    this.color = color; // 正確
  }
}

在子類的構(gòu)造函數(shù)中房午,只有調(diào)用super之后,才可以使用this關(guān)鍵字丹允,否則會(huì)報(bào)錯(cuò)郭厌。這是因?yàn)樽宇悓?shí)例的構(gòu)建,是基于對(duì)父類實(shí)例加工雕蔽,只有super方法才能返回父類實(shí)例沪曙。父類的靜態(tài)方法,也會(huì)被子類繼承萎羔。

注意液走,super雖然代表了父類Point的構(gòu)造函數(shù),但是返回的是子類ColorPoint的實(shí)例贾陷,即super內(nèi)部的this指的是ColorPoint缘眶,因此super()在這里相當(dāng)于Point.prototype.constructor.call(this)。

super這個(gè)關(guān)鍵字髓废,既可以當(dāng)作函數(shù)使用巷懈,也可以當(dāng)作對(duì)象使用。在這兩種情況下慌洪,它的用法完全不同顶燕。
作為函數(shù)時(shí),super()只能用在子類的構(gòu)造函數(shù)之中冈爹,用在其他地方就會(huì)報(bào)錯(cuò)涌攻。

    class A {}
    class B extends A {
      m() {
         super(); // 報(bào)錯(cuò)
      }
    }

第二種情況,super作為對(duì)象時(shí)频伤,在普通方法中恳谎,指向父類的原型對(duì)象;在靜態(tài)方法中,指向父類因痛。

     class A {
           p() {
            return 2;
          }
        }
     class B extends A {
            constructor() {
            super();
            console.log(super.p()); // 2
          }
        }
        let b = new B();

上面代碼中婚苹,子類B當(dāng)中的super.p()就是將super當(dāng)作一個(gè)對(duì)象使用。這時(shí)鸵膏,super在普通方法之中膊升,指向A.prototype,所以super.p()就相當(dāng)于A.prototype.p()谭企。這里需要注意廓译,由于super指向父類的原型對(duì)象,所以定義在父類實(shí)例上的方法或?qū)傩栽蘖菬o法通過super調(diào)用的责循。

7.Promise

在promise之前代碼過多的回調(diào)或者嵌套,可讀性差攀操、耦合度高院仿、擴(kuò)展性低。通過Promise機(jī)制速和,大大提高了代碼可讀性歹垫;用同步編程的方式來編寫異步代碼,保存線性的代碼邏輯颠放,極大的降低了代碼耦合性而提高了程序的可擴(kuò)展性排惨。

this.$http('/api/getData').then((res) => {
res = res.data;
this.dataList = res.result;
}).catch((err) => {
...
});

這是一個(gè)vue的異步請(qǐng)求,用的就是promise機(jī)制碰凶,這樣的好處是不會(huì)因?yàn)槎鄬拥幕卣{(diào)而降低代碼的可讀性暮芭。

當(dāng)然這只是promise的冰山一角,想要更好的掌握它還是需要更加深入的去學(xué)習(xí)它欲低。

8.Set

實(shí)例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)辕宏。下面先介紹四個(gè)操作方法。

  • 操作方法:
    add(value):添加某個(gè)值砾莱,返回Set結(jié)構(gòu)本身瑞筐。
    delete(value):刪除某個(gè)值,返回一個(gè)布爾值腊瑟,表示刪除是否成功聚假。
    has(value):返回一個(gè)布爾值热押,表示該值是否為Set的成員抚太。
    clear():清除所有成員俭茧,沒有返回值戚啥。
  • 遍歷方法:
    keys():返回鍵名的遍歷器
    values():返回鍵值的遍歷器
    entries():返回鍵值對(duì)的遍歷器
    forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
    由于 Set 結(jié)構(gòu)沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個(gè)值)
let str = [1,2,3,2,4,3,5,6,4,1,7];
console.log('str的長(zhǎng)度為:'+str.length); // 長(zhǎng)度為11
let s = new Set(str);
console.log(s);
console.log('去重后的長(zhǎng)度為:'+s.size);//長(zhǎng)度為7
console.log( Array.from(s));//Array.from 將Set轉(zhuǎn)換為數(shù)組形式

let set = new Set(['red', 'green', 'blue']);
var arr = new Set();
for (let item of set.keys()) {
  console.log(item);// red green blue
  arr.add(item);//將item添加到arr set結(jié)構(gòu)中
}
console.log(arr);
arr.forEach((value, key) => console.log(key + ' : ' + value));

9.import 和 export

//全部導(dǎo)入
import mallHeader from '../components/header.vue'
//導(dǎo)入部分
import {name, age} from './example'
// 導(dǎo)出默認(rèn), 有且只有一個(gè)默認(rèn)
export default App
// 部分導(dǎo)出
export class App extend Component {};

小結(jié)

這些僅僅是es6家族中的冰山一角挪略,想要更加全面的去掌握這一技能波材,就需要我們更加系統(tǒng)的去學(xué)習(xí)它酿愧。感謝花了這么長(zhǎng)時(shí)間游岳,閱讀文章的小伙伴們政敢,希望能對(duì)你們帶來幫助。有錯(cuò)誤的地方希望大佬們多多包涵胚迫,給我反饋喷户!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市访锻,隨后出現(xiàn)的幾起案子褪尝,更是在濱河造成了極大的恐慌,老刑警劉巖期犬,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件河哑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龟虎,警方通過查閱死者的電腦和手機(jī)璃谨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤妥,“玉大人佳吞,你說我怎么就攤上這事∶薨玻” “怎么了底扳?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贡耽。 經(jīng)常有香客問我衷模,道長(zhǎng),這世上最難降的妖魔是什么蒲赂? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任阱冶,我火速辦了婚禮,結(jié)果婚禮上凳宙,老公的妹妹穿的比我還像新娘熙揍。我一直安慰自己,他們只是感情好氏涩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布届囚。 她就那樣靜靜地躺著,像睡著了一般是尖。 火紅的嫁衣襯著肌膚如雪意系。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天饺汹,我揣著相機(jī)與錄音蛔添,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迎瞧,可吹牛的內(nèi)容都是我干的夸溶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凶硅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缝裁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起足绅,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤捷绑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氢妈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粹污,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年首量,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壮吩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕾总,死狀恐怖粥航,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情生百,我是刑警寧澤递雀,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蚀浆,受9級(jí)特大地震影響缀程,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜市俊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一杨凑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摆昧,春花似錦撩满、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忌锯,卻和暖如春伪嫁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工张咳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帝洪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓脚猾,卻偏偏與公主長(zhǎng)得像葱峡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婚陪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 一族沃、ES6簡(jiǎn)介 ? 歷時(shí)將近6年的時(shí)間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,071評(píng)論 8 25
  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評(píng)論 0 1
  • 以下內(nèi)容是我在學(xué)習(xí)和研究ES6時(shí)频祝,對(duì)ES6的特性泌参、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié)常空,可以做為ES6特性的字典沽一;在本...
    科研者閱讀 3,126評(píng)論 2 9
  • 《櫻桃》 年方十八的大姑娘穿碎布小花,走在小路上喊一聲櫻桃滿山都是櫻桃 《少年》 去歲正年少漓糙,明月清風(fēng)戀愛的時(shí)候他...
    茶人老七閱讀 265評(píng)論 3 2
  • 以前分享過自己做銷售感受的一篇文章《我是銷售我驕傲》昆禽,那時(shí)候我覺得銷售真的很簡(jiǎn)單蝗蛙,我覺得銷售很簡(jiǎn)單,只要做到...
    木木子記閱讀 620評(píng)論 0 0