es6語言特性的總結(jié)(1)

雖然在編寫項(xiàng)目的過程中,也會用到ES6的語法以及新特性。但感覺學(xué)習(xí)的不是特別系統(tǒng),索性這兩天重新刷了一下Understanding The ES6挽荠,也對ES6有了更深的理解。這里平绩,針對感覺應(yīng)用比較多圈匆,知識點(diǎn)比較重要的部分做了一下總結(jié)。內(nèi)容有點(diǎn)多捏雌,因此預(yù)計(jì)將分為三個(gè)部分跃赚。

塊級綁定-作用域

在ES5中,有一個(gè)知識難點(diǎn)性湿,就是變量提升和作用域纬傲。而這一部分之所以讓人困擾,則是因?yàn)镴S中變量的聲明方式會影響變量實(shí)際的創(chuàng)建位置肤频。

有一條規(guī)則是:使用var關(guān)鍵字聲明的變量叹括,無論其實(shí)際聲明位置在何處,都會被聲明與函數(shù)的頂部宵荒,這就是變量提升(hosting)汁雷。

ES6中為了讓變量的生命周期更加可控净嘀,引入了塊級聲明。即摔竿,讓所聲明的變量在指定塊的作用域外無法被訪問。ES6主要引入了兩個(gè)新的關(guān)鍵字少孝,letconst

let

letvar類似继低,不同是的,let聲明的變量不會存在變量提升的情況稍走。因此袁翁,下面這個(gè)代碼中:

{
  let a = 1;
}

console.log(a); 

是無法訪問到a變量的。

另一個(gè)限制的地方是婿脸,禁止重復(fù)聲明相同的變量粱胜。

var a = 1;
let a = 2;

上面的代碼也會報(bào)錯(cuò)。

const

這個(gè)關(guān)鍵字也是限制了變量提升以及重復(fù)聲明狐树,而且變量值是不可更改的焙压。

const a = 1;
a = 2; //報(bào)錯(cuò)

但是抑钟,如果綁定的是對象涯曲,可以更改對象屬性值。

const person = { 'name': 'xiaoming', 'age': 12};
person.name = 'zhangsan';
console.log(person.name); //zhangsan

暫時(shí)性死區(qū)

利用letconst聲明的變量在塔,代碼在訪問到聲明處前都是禁止訪問的幻件。

let a = 2;
a = b; // b is not defined
let b = 3;

循環(huán)中的let和const聲明

請看下面這段代碼:

var array = [];

for(var i = 0 ; i < 10; i++) {
    array.push(function() {
      console.log(i);
    });
}

array.forEach(function(func) { func(); }); //會輸出10次10

使用var聲明的變量,會在每次循環(huán)中被共享了蛔溃。因此绰沥,在循環(huán)內(nèi)部創(chuàng)建的函數(shù)都用于同一個(gè)變量的引用。通常解決這種方式贺待,在ES5中會采用閉包的方式徽曲。而ES6中,可以使用let關(guān)鍵字

var array = [];

for(let i = 0 ; i < 10; i++) {
    array.push(function() {
      console.log(i);
    });
}

array.forEach(function(func) { func(); }); //會依次輸出0...9

這是因?yàn)?code>let關(guān)鍵字在每次循環(huán)中麸塞,都會創(chuàng)建一個(gè)新的i變量疟位,而循環(huán)內(nèi)部的函數(shù)獲取的i變量其實(shí)都是副本。

const關(guān)鍵字不可以用在傳統(tǒng)的for循環(huán)中喘垂,但是可以用在for...offor … in語法中甜刻。使用效果和let一樣。

函數(shù)

ES6中對函數(shù)的功能做了新的擴(kuò)展正勒,使之使用起來更方便得院。

箭頭函數(shù)

自從有了箭頭函數(shù),在遇到回調(diào)函數(shù)寫法的時(shí)候章贞,就特別方便祥绞。當(dāng)然它的功能肯定不止于此。箭頭函數(shù)的語法像這樣:

(變量名,[其他變量名]) => { //函數(shù)體} 
//有以下幾種變形
(value1, value2) => {return value1 + value2;} 
(value1, value2) => value1 + value2; //函數(shù)體只有一條return語句的時(shí)候,可以省略return關(guān)鍵字和{}
value => value1 + 1; //單參數(shù)函數(shù)時(shí)候蜕径,可以省略括號

是傳統(tǒng)函數(shù)寫法的一種便捷寫法两踏,同時(shí),有以下幾個(gè)特點(diǎn):

  1. 不允許重復(fù)的具名參數(shù)
  2. 沒有arguments對象
  3. 不能更改this兜喻,在整個(gè)函數(shù)聲明周期內(nèi)其值會保持不變梦染,因此,在遇到this問題時(shí)朴皆,不用再像ES5之前的時(shí)期使用類似var self =thisbind(this)之類的方法了帕识。
  4. 不能被new調(diào)用
  5. 沒有this、super遂铡、arguments肮疗、也沒有new.target綁定

默認(rèn)參數(shù)和不具名參數(shù)

先看下面這個(gè)例子,同時(shí)使用了默認(rèn)參數(shù)和不具名參數(shù)(也叫做剩余參數(shù)):

//num1如果不傳值或者為undefined的話為0, num2是一個(gè)數(shù)組代表后續(xù)傳進(jìn)來的參數(shù)集合
function add(num1 = 0, ...num2) {
    num2.forEach(i => num1 = num1 + i);
    return num1;
}

console.log(add(undefined,2)); //2

console.log(add(undefined,2,3)); //5

console.log(add(1,2,3)); //6

采用了默認(rèn)參數(shù)值時(shí)扒接,仍然可以使用arguments對象來反應(yīng)真實(shí)函數(shù)的調(diào)用狀態(tài)伪货, 而arguments對象也可以和不具名參數(shù)進(jìn)行協(xié)同工作。

function add(num1 = 1, num2 = 1) {
    console.log(arguments);
}

add(1); //[1]
add(2, 3); //[2,3]
add(); //[]
add(2,3,4,5,6); //[2,3,4,5,6]

同時(shí)钾怔,函數(shù)的默認(rèn)值甚至可以利用函數(shù)來動態(tài)生成超歌,而非寫死的,如:

function getNum() {
  return parseInt(Math.random() * 10);
}

function add(num1 = getNum(), num2 = 1) {
  console.log(num1 + num2);
}

//每次調(diào)用的結(jié)果是隨機(jī)的蒂教,以下為某一次調(diào)用的結(jié)果
add(); // 8
add(); // 4

需要注意的是巍举,函數(shù)的不具名參數(shù)是不能夠在對象的setter上使用的,這是因?yàn)?code>setter只接受單一值作為它的參數(shù)凝垛。

擴(kuò)展運(yùn)算符

這三個(gè)點(diǎn)運(yùn)算符用在函數(shù)聲明的時(shí)候懊悯,就是不具名參數(shù),但是它同時(shí)也能用在解構(gòu)對象上梦皮,因此炭分,在函數(shù)調(diào)用過程中,可以使用該運(yùn)算符剑肯,進(jìn)行多個(gè)參數(shù)傳遞捧毛。如

var randomArray = [2,3,1231,455,231,23,553];
console.log(Math.max(...randomArray)); //1231

new.target

這是ES6函數(shù)對象的元屬性,可以通過檢查new.target對象是否被定義让网,可以判斷函數(shù)是否通過new進(jìn)行調(diào)用呀忧。

function Cat() {
  if(new.target === undefined) {
    console.log('this is not called by NEW keyword');
  }else {
    console.log('this is called by NEW keyword');
  }
}

new Cat(); //this is called by NEW keyword
Cat.call(this); //this is not called by NEW keyword

原理方面,其實(shí)就是當(dāng)函數(shù)的構(gòu)造器(constructor)方法被調(diào)用時(shí)溃睹,new.target 會被填入 new 運(yùn)算符的作用目標(biāo)而账,該目標(biāo)通常是新創(chuàng)建的對象實(shí)例的構(gòu)造器,并且會成為函數(shù)體內(nèi)部的 this 值因篇。而若call方法被執(zhí)行的時(shí)候泞辐, new.target 的值則會是undefined 笔横。

解構(gòu)

解構(gòu)的意思是將數(shù)據(jù)結(jié)構(gòu)分解為更小的部分,而ES6中引入了解構(gòu)的方式目的就是能夠更好地提取數(shù)據(jù)咐吼。

對象解構(gòu)

直接上例子:

let { type, name } = node //普通解構(gòu)
let { type, name, value = true } = node; //默認(rèn)值解構(gòu)
let { type: localType, name: localName } = node; //賦值給不同的本地對象
let { loc: { start: localStart }} = node; //嵌套的解構(gòu)方式,等同于localStart = node.loc.start

以上需要注意的是吹缔,當(dāng)解構(gòu)賦值表達(dá)式的右側(cè)( = 后面的表達(dá)式)的計(jì)算結(jié)果為 null 或 undefined 時(shí),會拋出錯(cuò)誤锯茄。

數(shù)組解構(gòu)

數(shù)組解構(gòu)時(shí)厢塘,解構(gòu)作用在數(shù)組內(nèi)部的位置上,而不是作用在對象的具名屬性上撇吞。

let [ , , thirdColor ] = colors;

let [ firstColor, secondColor = "green" ] = colors; //默認(rèn)值

let [ firstColor, [ secondColor ] ] = colors; //嵌套解構(gòu)

let [ firstColor, ...restColors ] = colors; //剩余項(xiàng)

[a, b] = [b, a]; //數(shù)組解構(gòu)賦值有一個(gè)非常獨(dú)特的用例俗冻,能輕易地互換兩個(gè)變量的值

參數(shù)解構(gòu)

function doSomething(value1, value2, {value3, value4, value5}) {

}

需要注意的是默認(rèn)情況下調(diào)用函數(shù)時(shí)未給參數(shù)解構(gòu)傳值會拋出錯(cuò)誤礁叔。但若你要求它是可選的牍颈,可以給解構(gòu)的參數(shù)提供默認(rèn)值來處理這種行為。

function dosomething(value1, value2, {value3, value4, value5} = {}) {
  //dosomething
}

擴(kuò)展的對象功能

在ES6中也對對象的使用方式做了進(jìn)一步的擴(kuò)展琅关,使其無論是在代碼編寫形式層面還是底層操作對象的層面都有了更多的特性煮岁。

對象類別

在ES6規(guī)范中,定義了對象的每種類別:

1.普通對象:擁有JS對象所有默認(rèn)的內(nèi)部行為

2.奇異對象:有別于默認(rèn)的內(nèi)部行為的對象

3.標(biāo)準(zhǔn)對象:是在ES6中被定義的對象涣易,可以是普通對象也可以是奇異對象画机。

4.內(nèi)置對象:在腳本開始運(yùn)行時(shí)由JS運(yùn)行環(huán)境(瀏覽器或Node)提供的對象。所有標(biāo)準(zhǔn)對象都是內(nèi)置對象新症。

屬性初始化器

當(dāng)對象的一個(gè)屬性名稱與本地變量名相同的時(shí)候步氏,可以省略冒號和值,如:

function createPerson(name, age) {
  return {
    name,
    age
  }
}
//等同于
function createPerson(name, age) {
    return {
      name: name,
      age: age
    }
}

方法簡寫

方法簡寫如下:

var person = {
  name: 'nihao',
  getName() {
    return this.name;
  }
}

//等同與
var person = {
  name: 'nihao',
  getName: function() {
    return this.name;
  }
}

需要注意的是徒爹,使用方法簡寫荚醒,在方法內(nèi)部可以使用super方法,而傳統(tǒng)的寫法是無法使用的隆嗅。

計(jì)算性屬性名

屬性名可以使用拼接的寫法界阁,如:

var name = 'name';

var person = {
  ['first' + name]: 'scq',
  ['last' + name]: '000',
  getName() {
    return this.firstname + this.lastname;
  }
}

對于某些需要動態(tài)生成屬性名的場合,寫法更加方便胖喳。

Object.is方法

為了避免在對象比較過程中的強(qiáng)制對象轉(zhuǎn)換泡躯。通常該方法的運(yùn)行結(jié)果和===一樣,但是+0-0,NaNNaN不相同丽焊。

Object.assign(source, target) 方法

該方法接受一個(gè)接收者较剃,以及任意數(shù)量的供應(yīng)者,并會返回接收者技健。我通常在使用的時(shí)候重付,用來做繼承或者說深度拷貝?凫乖?确垫。

    const person = {
      name: 'scq000',
      age: 23,
      addressInfo: {
        city: 'zs',
        address: 'some address'
      }
    }
    const person2 = Object.assign({}, person);

Object.assign() 方法接受任意數(shù)量的供應(yīng)者弓颈,而接收者會按照供應(yīng)者在參數(shù)中的順序來依次接收它們的屬性。這意味著在接收者中删掀,第二個(gè)供應(yīng)者的屬性可能會覆蓋第一個(gè)供應(yīng)者的翔冀。

關(guān)于重復(fù)的對象字面量屬性

ES6 移除了重復(fù)屬性的檢查,嚴(yán)格模式與非嚴(yán)格模式都不再檢查重復(fù)的屬性披泪。當(dāng)存在重復(fù)屬性時(shí)纤子,排在后面的屬性的值會成為該屬性的實(shí)際值。

自有屬性的枚舉順序

1.所有的數(shù)字類型鍵款票,按升序排列控硼。

2.所有的字符串類型鍵,按被添加到對象的順序排列艾少。

3.所有的符號類型鍵卡乾,也按添加順序排列。

修改對象的原型

對象原型的實(shí)際值被存儲在一個(gè)內(nèi)部屬性[[Prototype]] 上缚够, Object.getPrototypeOf() 方法會返回此屬性存儲的值幔妨,而 Object.setPrototypeOf() 方法則能夠修改該值。ES6 通過添加 Object.setPrototypeOf()方法而改變了這種假定谍椅,此方法允許你修改任意指定對象的原型误堡。它接受兩個(gè)參數(shù):需要被修改原型的對象,以及將會成為前者原型的對象雏吭。
因?yàn)檫@個(gè)特性的添加锁施,可以使用 super 進(jìn)行簡單的原型訪問。super 是指向當(dāng)前對象的原型的一個(gè)指針杖们,實(shí)際上就是 Object.getPrototypeOf(this) 的值悉抵。這個(gè)功能在使用ES6類的繼承的時(shí)候,提供了更好的訪問父類的方式胀莹。

class Animal {
  constructor(name, size) {
    this.name = name;
    this.size = size;
  }
}

class Cat  extends Animal {
  constructor(size) {
    super('cat', size);
  }
}

系列二
系列三

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末基跑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子描焰,更是在濱河造成了極大的恐慌媳否,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荆秦,死亡現(xiàn)場離奇詭異篱竭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)步绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門掺逼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓤介,你說我怎么就攤上這事吕喘∽改牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵氯质,是天一觀的道長募舟。 經(jīng)常有香客問我,道長闻察,這世上最難降的妖魔是什么拱礁? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮辕漂,結(jié)果婚禮上呢灶,老公的妹妹穿的比我還像新娘。我一直安慰自己钉嘹,他們只是感情好鸯乃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隧期,像睡著了一般飒责。 火紅的嫁衣襯著肌膚如雪赘娄。 梳的紋絲不亂的頭發(fā)上仆潮,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音遣臼,去河邊找鬼性置。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揍堰,可吹牛的內(nèi)容都是我干的鹏浅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屏歹,長吁一口氣:“原來是場噩夢啊……” “哼隐砸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝙眶,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤季希,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幽纷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體式塌,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年友浸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峰尝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡收恢,死狀恐怖武学,靈堂內(nèi)的尸體忽然破棺而出祭往,到底是詐尸還是另有隱情,我是刑警寧澤火窒,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布链沼,位于F島的核電站,受9級特大地震影響沛鸵,放射性物質(zhì)發(fā)生泄漏括勺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一曲掰、第九天 我趴在偏房一處隱蔽的房頂上張望疾捍。 院中可真熱鬧,春花似錦栏妖、人聲如沸乱豆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛裕。三九已至,卻和暖如春论泛,著一層夾襖步出監(jiān)牢的瞬間揩尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工屁奏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩榆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓坟瓢,卻偏偏與公主長得像勇边,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子折联,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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

  • 一粒褒、ES6簡介 ? 歷時(shí)將近6年的時(shí)間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,071評論 8 25
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值诚镰,只能采用變通的方法奕坟。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,384評論 0 1
  • 三,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn)怕享,只要將碼點(diǎn)放入大括號执赡,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,532評論 0 8
  • 特別說明函筋,為便于查閱沙合,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 568評論 0 0
  • 第一步,線稿究履。 第二步滤否,畫兩朵。 第三步最仑,畫三朵藐俺。 第四步,畫枝干和花苞泥彤。 第五步欲芹,畫小貼紙,完成吟吝。 深夜來相會的...
    和塵之塵閱讀 593評論 3 12