ES6 解構(gòu)賦值 & 模板字符串

一廊营、函數(shù)的默認(rèn)參數(shù)

ES6 之前楞卡,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法挑童。

function log(x, y) {
  y = y || 'World';
  console.log(x, y);
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

ES6 允許為函數(shù)的參數(shù)設(shè)置默認(rèn)值闪水,即直接寫在參數(shù)定義的后面糕非。

function log(x, y = 'World') {
  console.log(x, y);
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello

注意與 Python 的區(qū)別,JS 每次調(diào)用函數(shù)都會(huì)重新生成一個(gè)array球榆,而 Python 是直接追加到第一次生成的那個(gè)array

JS
Python

二朽肥、函數(shù)的 rest 參數(shù)

ES5 用arguments來獲取函數(shù)多余的參數(shù)

function sum(message) {
  let result = 0
  for (let i = 1; i < arguments.length; i++) {
    result += arguments[i]
  }
  return message + result
}
sum('結(jié)果是', 1, 2, 3, 4, 5, 6) // "結(jié)果是21"

ES6 引入rest參數(shù)(形式為...變量名),用于獲取函數(shù)的多余參數(shù)持钉,這樣就不需要使用arguments對(duì)象了衡招。rest參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中每强。

function sum(message, ...numbers) {
  let result = numbers.reduce((a, b) => {
    return a + b
  }, 0)
  return message + result
}
sum('結(jié)果是', 1, 2, 3, 4, 5, 6) // "結(jié)果是21"

注意:
arguments對(duì)象是一個(gè)“偽數(shù)組”始腾。所以為了使用數(shù)組的方法,必須使用Array.prototype.slice.call先將其轉(zhuǎn)為數(shù)組(還可以使用Array.from或者...)空执。而rest參數(shù)就是一個(gè)真正的數(shù)組浪箭,數(shù)組特有的方法都可以使用。

三辨绊、數(shù)組的擴(kuò)展運(yùn)算符

擴(kuò)展運(yùn)算符(spread)是三個(gè)點(diǎn)(...)奶栖。它好比rest參數(shù)的逆運(yùn)算,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列门坷。

console.log(...[1, 2, 3])
// 1 2 3

console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5

[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

該運(yùn)算符主要用于函數(shù)調(diào)用宣鄙。

function push(array, ...items) {
  array.push(...items);
  return array
}
push([], ...[1, 2, 3]) // [1, 2, 3]

function add(x, y) {
  return x + y;
}

const numbers = [4, 38];
add(...numbers) // 42

注意:只有函數(shù)調(diào)用時(shí),擴(kuò)展運(yùn)算符才可以放在圓括號(hào)中拜鹤,否則會(huì)報(bào)錯(cuò)框冀。

(...[1, 2])
// Uncaught SyntaxError: Unexpected number

console.log((...[1, 2]))
// Uncaught SyntaxError: Unexpected number

console.log(...[1, 2])
// 1 2

四流椒、解構(gòu)賦值

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

以前敏簿,為變量賦值,只能直接指定值宣虾。

let a = 1
let b = 2

oldA = a
a = b
b = oldA

console.log(a, b) // 2,1

ES6 的寫法可以從數(shù)組中提取值惯裕,按照對(duì)應(yīng)位置,對(duì)變量賦值绣硝。

let a = 1
let b = 2; // 注意這里有分號(hào)

[a, b] = [b, a]

console.log(a, b) // 2,1

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

let [foo = true] = [];
foo // true

let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

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

數(shù)組的元素是按次序排列的,變量的取值由它的位置決定鹉胖;而對(duì)象的屬性沒有次序握玛,變量必須與屬性同名够傍,才能取到正確的值。

let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"

let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined

對(duì)象的解構(gòu)賦值是下面形式的簡(jiǎn)寫

let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };

也就是說挠铲,對(duì)象的解構(gòu)賦值的內(nèi)部機(jī)制冕屯,是先找到同名屬性,然后再賦給對(duì)應(yīng)的變量拂苹。真正被賦值的是后者安聘,而不是前者。

let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined

上面代碼中瓢棒,foo是匹配的模式浴韭,baz才是變量。真正被賦值的是變量baz脯宿,而不是模式foo念颈。

容易混淆的點(diǎn):foo什么時(shí)候是被賦值的變量?什么時(shí)候是匹配模式连霉?

let { foo } = { foo: 'aaa' }; // 此時(shí) foo 就是被賦值的變量

let { foo: baz } = { foo: 'aaa' }; // 此時(shí) foo 為匹配模式舍肠,baz 為被賦值的變量

3. 解構(gòu)賦值的用途

(1)交換變量的值
(2)從函數(shù)返回多個(gè)值
(3)函數(shù)參數(shù)的定義
(5)函數(shù)參數(shù)的默認(rèn)值
(6)遍歷 Map 結(jié)構(gòu)
(7)輸入模塊的指定方法

五、如何合并對(duì)象

Object.assign()

let obj1 = {
  a: 1,
  b: 2
}
let obj2 = {
  a: 3,
  c: 4
}

let obj3 = Object.assign({}, obj1, obj2)
console.log(obj3) // {a: 3, b: 2, c: 4}

...

let obj1 = {
  a: 1,
  b: 2
}
let obj2 = {
  a: 3,
  c: 4
}

let obj3 = {...obj1, ...obj2}
console.log(obj3) // {a: 3, b: 2, c: 4}

六窘面、模板字符串

1. 多行字符串

傳統(tǒng)的 JavaScript 語言翠语,定義多行字符串是這樣寫的

/*\后只要有空格就會(huì)報(bào)錯(cuò)*/ 
var string = "\
<div>\
   <p>awsl</p>\
</div>"
console.log(string) // <div><p>awsl</p></div>

/*+ 后面允許有空格,但寫起來太繁瑣*/ 
var string = "" +
"<div>" +
   "<p>awsl</p>" +
"</div>"
console.log(string) // <div><p>awsl</p></div>

上面兩種寫法不僅寫起來繁瑣财边,而且輸出結(jié)果里面也不包含回車

因此肌括,ES6 引入了模板字符串。它可以當(dāng)作普通字符串使用酣难,也可以用來定義多行字符串谍夭,或者在字符串中嵌入變量。

var string = `
<div>
   <p>awsl</p>
</div>
`
console.log(string) // 結(jié)果包含回車
/*<div>
     <p>awsl</p>
  </div>*/

2. 字符串里插入變量(插值)

// 字符串中嵌入變量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

3. 函數(shù)接字符串

更標(biāo)準(zhǔn)的說法是帶標(biāo)簽的模板字符串憨募,這種形式的函數(shù)的第一個(gè)參數(shù)是一個(gè)字符串值的數(shù)組紧索,其余的參數(shù)與表達(dá)式相關(guān)。

var name = 'aaa'
var person = '人'
var fn = function() {
  console.log(arguments) // [["", "是一個(gè)", ""], "aaa", "人"]
  let strings = arguments[0] // ["", "是一個(gè)", ""]
  let var1 = arguments[1] // "aaa"
  let var2 = arguments[2] // "人"
  if (var1 === 'aaa') {
    return var1 + strings[1] + '好人'
  } else {
    return var1 + strings[1] + '壞人'
  }
}

fn`${name}是一個(gè)${person}`

styled-component 就是用的這個(gè)語法

參考:
http://es6.ruanyifeng.com/#docs/function
http://es6.ruanyifeng.com/#docs/string
http://es6.ruanyifeng.com/#docs/destructuring
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菜谣,一起剝皮案震驚了整個(gè)濱河市珠漂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尾膊,老刑警劉巖媳危,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冈敛,居然都是意外死亡待笑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門抓谴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暮蹂,“玉大人寞缝,你說我怎么就攤上這事⊙鲂海” “怎么了第租?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)我纪。 經(jīng)常有香客問我慎宾,道長(zhǎng),這世上最難降的妖魔是什么浅悉? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任趟据,我火速辦了婚禮,結(jié)果婚禮上术健,老公的妹妹穿的比我還像新娘汹碱。我一直安慰自己,他們只是感情好荞估,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布咳促。 她就那樣靜靜地躺著,像睡著了一般勘伺。 火紅的嫁衣襯著肌膚如雪跪腹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天飞醉,我揣著相機(jī)與錄音冲茸,去河邊找鬼。 笑死缅帘,一個(gè)胖子當(dāng)著我的面吹牛轴术,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钦无,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼逗栽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了失暂?” 一聲冷哼從身側(cè)響起彼宠,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趣席,沒想到半個(gè)月后兵志,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醇蝴,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宣肚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悠栓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霉涨。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡按价,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笙瑟,到底是詐尸還是另有隱情楼镐,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布往枷,位于F島的核電站框产,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏错洁。R本人自食惡果不足惜秉宿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屯碴。 院中可真熱鬧描睦,春花似錦、人聲如沸导而。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽今艺。三九已至韵丑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虚缎,已是汗流浹背埂息。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遥巴,地道東北人千康。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铲掐,于是被迫代替她去往敵國和親拾弃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,773評(píng)論 0 1
  • 三摆霉,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn)豪椿,只要將碼點(diǎn)放入大括號(hào),就能正確解讀該字符携栋。有了這...
    eastbaby閱讀 1,518評(píng)論 0 8
  • 前面的話 我們經(jīng)常定義許多對(duì)象和數(shù)組搭盾,然后有組織地從中提取相關(guān)的信息片段。在ES6中添加了可以簡(jiǎn)化這種任務(wù)的新特性...
    sunnyghx閱讀 749評(píng)論 0 0
  • “人們很容易高估某個(gè)決定性時(shí)刻的重要性婉支,也很容易低估每天進(jìn)行微小改進(jìn)的價(jià)值鸯隅。” 習(xí)慣是自我提高的復(fù)利。 提示蝌以、渴求...
    漁歌子珊閱讀 271評(píng)論 0 0
  • 今日大盤收紅了炕舵,見漲,收一個(gè)小十字星跟畅,面對(duì)前高處那個(gè)跳空缺口咽筋,多空雙方基本上形成勢(shì)均力敵的態(tài)勢(shì)。小十字星下長(zhǎng)上短徊件,...
    風(fēng)起時(shí)我在這里閱讀 156評(píng)論 0 1