ES6 基本用法

let

  • 用來(lái)聲明變量梁丘,只在聲明塊內(nèi)有效
  • 不存在變量提升
function add(){
    console.log(a); // ReferenceError: Cannot access 'a' before initialization
    let a = 1;
    console.log(a); // => 1
    if(a===1){
        let b = 2;
        console.log(b); // => 2
    }
    console.log(b); // ReferenceError: b is not defined
}
add()
  • 暫時(shí)性死區(qū)(簡(jiǎn)稱(chēng)TDZ
    只要塊級(jí)作用域內(nèi)存在let命令伤靠,它所聲明的變量就“綁定”這個(gè)區(qū)域范咨,不再受外部影響。
    在代碼塊內(nèi)师抄,使用let命令之前漓柑,該變量都是不可用的,這在語(yǔ)法上,稱(chēng)為“暫時(shí)性死區(qū)
var tmp = 123;
if (true) {
  console.log(tmp);  // ReferenceError: Cannot access 'tmp' before initialization
  let tmp;
}

ES6 明確規(guī)定辆布,如果區(qū)塊中存在letconst命令瞬矩,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開(kāi)始就形成了封閉作用域锋玲,凡是在聲明之前就使用這些變量景用,就會(huì)報(bào)錯(cuò)。

  • 比較隱蔽的“死區(qū)”
function bar(x = y, y = 2) {
  return [x, y];
}
bar(); // 報(bào)錯(cuò)

參數(shù)x默認(rèn)值等于另一個(gè)參數(shù)y惭蹂,而此時(shí)y還沒(méi)有聲明伞插,屬于“死區(qū)”。

  • 不允許重復(fù)聲明
    let不允許在相同作用域內(nèi)盾碗,重復(fù)聲明同一個(gè)變量
// 報(bào)錯(cuò)
function func() {
  let a = 10;
  var a = 1;
}

// 報(bào)錯(cuò)
function func() {
  let a = 10;
  let a = 1;
}
// 不能在函數(shù)內(nèi)部重新聲明參數(shù)媚污。
function func(arg) {
  let arg;
}
func() // 報(bào)錯(cuò)

function func(arg) {
  {
    let arg;
  }
}
func() // 不報(bào)錯(cuò)

ES6 的塊級(jí)作用域

如下代碼如果使用var定義變量,會(huì)輸出10廷雅,但是塊級(jí)作用域外層代碼塊不受內(nèi)存代碼塊影響

function f () {
  let n = 5;
  if ( true ) {
    let n = 10;
  }
  console.log(n); // 5
}

const

  • const聲明一個(gè)只讀的常量耗美,一旦聲明,常量的值就不能改變航缀。
  • const一旦聲明變量商架,就必須立即初始化,不能留到以后賦值芥玉。
  • const只聲明不賦值會(huì)報(bào)錯(cuò)蛇摸。
  • const的作用域與let相同,只在聲明所在的塊級(jí)作用域內(nèi)有效灿巧。
  • const聲明不提升赶袄。
  • const存在暫時(shí)性死區(qū),只能在聲明的位置后面使用抠藕。
  • const不可重復(fù)聲明弃鸦。

頂層對(duì)象的屬性

頂層對(duì)象在瀏覽器環(huán)境指的是window對(duì)象,在Node 指的是global對(duì)象幢痘。

  • ES5中,頂層對(duì)象的屬性與全局變量是等價(jià)的家破。
window.a = 1;
a ; // => 1

a = 2;
window.a; // => 2

上邊代碼中颜说,頂層對(duì)的屬性賦值與全局變量的賦值,是同一件事汰聋。

  • ES6規(guī)定门粪,letconst烹困、class聲明的全局變量玄妈,不屬于頂層對(duì)象的屬性。
let b = 1;
window.b; // undefined

數(shù)組的解構(gòu)賦值

  • ES6允許按照一定模式,從數(shù)組和對(duì)象中提取值拟蜻,對(duì)變量進(jìn)行賦值绎签,這被稱(chēng)為解構(gòu)
let a = 1;
let b = 2;
let c = 3;
// ES6 允許寫(xiě)成下面這樣
let [a,b,c] = [1,2,3];
  • 這種寫(xiě)法屬于“模式匹配”,只要等號(hào)兩邊的模式相同酝锅,左邊的變量就會(huì)被賦對(duì)應(yīng)的值诡必。
let [x,,y] = [1,2,3];
x // => 1,
y // => 3

let [x,...y] = [1,2,3,4];
x; // => 1
y; // => [2,3,4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
  • 如果解構(gòu)不成功,變量的值就等于undefined
let [a] = [];
let [b,a] = [1];
// a 的值都是undefined
  • 如果等號(hào)右邊不是數(shù)組搔扁,那么將會(huì)報(bào)錯(cuò)爸舒。

  • 解構(gòu)賦值允許指定默認(rèn)值

let [a = 1] = [];
a; // => 1
  • ES6內(nèi)部使用嚴(yán)格相等運(yùn)算符(===),判斷一個(gè)位置是否有值稿蹲,所以只有當(dāng)數(shù)組成員嚴(yán)格等于undefined扭勉,默認(rèn)值才生效。
let [a = 1] = [undefined];
a; // => 1
let [b = 1] = [null];
b; // => null   因?yàn)閚ull不嚴(yán)格等于undefined
  • 如果默認(rèn)值是一個(gè)表達(dá)式苛聘,那么這個(gè)表達(dá)式是惰性求值的涂炎,只有在用到的時(shí)候,才會(huì)求值
function f(){
  console.log('aaaa');
}
let [a = f()] = [1];
a; // => 1 因?yàn)閍能取到值焰盗,所以f根本不會(huì)執(zhí)行

對(duì)象的解構(gòu)賦值

對(duì)象的解構(gòu)與數(shù)組不同璧尸,數(shù)組的元素是按次序排列的,變量的取值由它的位置決定熬拒,而對(duì)象的屬性沒(méi)有次序爷光,變量必須與屬性同名,才能取到正確的值澎粟。

let { b , a } = { a:1 , b:2 };
a; // => 1
b; // => 2 
let { c } = { a:1 , b:2 };
c; // => undefined  解構(gòu)失敗蛀序,變量的值等于undefined
  • 如果變量名與屬性名不一致
let obj = {first:"hello",last:"world"};
let {first:h,last:w} = obj;
h; // => 'hello'
w: // => 'world'
  • 對(duì)象的解構(gòu)賦值可以取到繼承的屬性
let o1 = {
   x: 1
};
let o2 = Object.create(o1);
o2.y = 2;
const { x , y } = o2;
x; // => 1
y; // => 2
  • 對(duì)象的解構(gòu)也可以指定默認(rèn)值
let { x = 1 } = {};
x; // => 1

let { x: y = 2 } = {};
y; // => 2
  • 默認(rèn)值生效條件是,對(duì)象的屬性值嚴(yán)格等于undefined活烙。
let { x:1 } = { x:undefined };
x; // => 1

let { y:2 } = { y:null };
y; // null

字符串的解構(gòu)賦值

字符串也可以解構(gòu)賦值徐裸,這是因?yàn)樽址畷?huì)被轉(zhuǎn)成一個(gè)類(lèi)似數(shù)組的對(duì)象。

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
//類(lèi)似數(shù)組的對(duì)象都有一個(gè)length屬性啸盏,因此還可以對(duì)這個(gè)屬性解構(gòu)賦值
let {length : len} = 'hello';
len // 5

模板字符串

const value = 'o';
let str = `hell${value} world`;

includes()重贺、startsWith()、endsWith()

三個(gè)方法都是用來(lái)確定一個(gè)字符串是否包含在另一個(gè)字符串中

  • includes()返回布爾值回懦,表示是否找到了參數(shù)字符串
  • startsWith()返回布爾值气笙,表示參數(shù)字符串是否在原字符串的頭部
  • endsWith()返回布爾值,表示參數(shù)字符串是否在原字符串的尾部
let str = 'hello world!';
str.includes('el'); // => true
str.startsWith('he');// => true
str.startsWith('e'); // => false
str.endsWith('d!'); // => true
str.endsWith('d'); // => false
  • 第二個(gè)參數(shù)表示開(kāi)始搜索的位置
  • endsWith使用第二個(gè)參數(shù)時(shí)怯晕,表示的是前n個(gè)字符潜圃。
str.includes('lo',4); // => false
str.startsWith('lo',3); // => true 相當(dāng)于指定開(kāi)始位置
str.endsWith('hel',3); // => true 表示前三個(gè)字符是存在的

實(shí)例方法:repeat()

  • repeat()方法返回一個(gè)字符串,表示將原字符串重復(fù)n次舟茶。
'x'.repeat(3); // => 'xxx'
'x'.repeat(0); // => ''
  • 參數(shù)如果是小數(shù)會(huì)向下取整
'x'.repeat(2.9); // => 'xx'
  • 參數(shù)如果是負(fù)數(shù)或者Infinity谭期,會(huì)報(bào)錯(cuò)堵第,但是0 ~ -1之間的小數(shù)等同于0,
  • NaN等同于0
'x'.repeat(-1); // 報(bào)錯(cuò)
'x'.repeat(-0.2); // => '' 參數(shù)認(rèn)為是0
'x'.repeat(NaN); // => ''  
  • 參數(shù)如果是字符串先轉(zhuǎn)成數(shù)字
'x'.repeat('aaa'); // => ''  
'x'.repeat('3'); => 'xxx'

如上:'aaa'轉(zhuǎn)成數(shù)字是NaNNaN等同于0隧出,所以輸出空字符串


實(shí)例方法:padStart()踏志、padEnd()

字符串補(bǔ)全功能,如果某個(gè)字符串不夠指定長(zhǎng)度鸳劳,會(huì)在頭部或尾部補(bǔ)全狰贯。

'x'.padStart(5, 'ab') // 'ababx'
'x'.padEnd(5, 'ab') // 'xabab'

'1'.padStart(4, 'lx') // 'lxl1'
  • 如果原字符串的長(zhǎng)度,等于或大于最大長(zhǎng)度赏廓,則字符串補(bǔ)全不生效涵紊,返回原字符串。
  • 如果省略第二個(gè)參數(shù)幔摸,默認(rèn)使用空格補(bǔ)全長(zhǎng)度摸柄。

實(shí)例方法:trimStart()、trimEnd()

ES2019對(duì)字符串實(shí)例新增了trimStart()既忆、trimEnd()這兩方法驱负。

  • trimStart():消除字符串頭部的空格
  • trimEnd():消除字符串頭部的空格
  • 它們都返回新字符串,不會(huì)修改原始字符串
  • 除了空格鍵患雇,這兩個(gè)方法對(duì)字符串頭部(或尾部)的 tab 鍵跃脊、換行符等不可見(jiàn)的空白符號(hào)也有效。
const a = ' ab ';
s.trim(); // => "ab"
s.trimStart(); // => "ab "
s.trimEnd(); // => " ab"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苛吱,一起剝皮案震驚了整個(gè)濱河市酪术,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠储,老刑警劉巖绘雁,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異援所,居然都是意外死亡庐舟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)住拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挪略,“玉大人,你說(shuō)我怎么就攤上這事滔岳∥灵荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵澈蟆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我卓研,道長(zhǎng)趴俘,這世上最難降的妖魔是什么睹簇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮寥闪,結(jié)果婚禮上太惠,老公的妹妹穿的比我還像新娘。我一直安慰自己疲憋,他們只是感情好凿渊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缚柳,像睡著了一般埃脏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秋忙,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天彩掐,我揣著相機(jī)與錄音,去河邊找鬼灰追。 笑死堵幽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹澎。 我是一名探鬼主播朴下,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苦蒿!你這毒婦竟也來(lái)了殴胧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刽肠,失蹤者是張志新(化名)和其女友劉穎溃肪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體音五,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惫撰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躺涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厨钻。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坚嗜,靈堂內(nèi)的尸體忽然破棺而出夯膀,到底是詐尸還是另有隱情,我是刑警寧澤苍蔬,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布诱建,位于F島的核電站,受9級(jí)特大地震影響碟绑,放射性物質(zhì)發(fā)生泄漏俺猿。R本人自食惡果不足惜茎匠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望押袍。 院中可真熱鬧诵冒,春花似錦、人聲如沸谊惭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圈盔。三九已至豹芯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間药磺,已是汗流浹背告组。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癌佩,地道東北人木缝。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像围辙,于是被迫代替她去往敵國(guó)和親我碟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • let命令 let聲明的變量姚建,只在let命令所在的代碼塊內(nèi)有效 不存在變量提升 不允許重復(fù)聲明{let a = 1...
    花霏花閱讀 195評(píng)論 0 1
  • [TOC] 參考阮一峰的ECMAScript 6 入門(mén)參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評(píng)論 0 1
  • 1矫俺, ECMAScript 和 JavaScript 的關(guān)系 ECMAScript 和 JavaScript 的關(guān)...
    小王子__閱讀 1,387評(píng)論 0 1
  • 第一章:塊級(jí)作用域綁定 塊級(jí)聲明 1.var聲明及變量提升機(jī)制:在函數(shù)作用域或者全局作用域中通過(guò)關(guān)鍵字var聲明的...
    BeADre_wang閱讀 841評(píng)論 0 0
  • 這樣深厚的淵源,林悅也能忘掉掸冤? “在你心里我到底算個(gè)什么呀厘托?P嗎?”何耀的語(yǔ)氣越來(lái)越冷厲稿湿,然后他摸出香煙铅匹,點(diǎn)燃后狠...
    胡小萊閱讀 110評(píng)論 0 5