ES6新特性有哪些叉钥?
- 變量聲明:由var變?yōu)閘et和const香椎;
- 模板字符串:使用反引號(hào) `` 畴栖;在模板字符串里面支持換行,并可以在里面使用${}來(lái)包裹一個(gè)變量或表達(dá)式;
- 解構(gòu)賦值:有數(shù)組解構(gòu)和對(duì)象解構(gòu)蹈垢,可以快速獲取數(shù)組和對(duì)象的值慷吊;
- 擴(kuò)展運(yùn)算符:在ES6中用...來(lái)表示展開(kāi)運(yùn)算符,它可以將數(shù)組或者對(duì)象進(jìn)行展開(kāi);
- 箭頭函數(shù):函數(shù)的快捷寫(xiě)法曹抬,不需要通過(guò)function關(guān)鍵字創(chuàng)建函數(shù)溉瓶,并且可以省略return關(guān)鍵字,但函數(shù)體內(nèi)的this對(duì)象指的是定義時(shí)所在的對(duì)象谤民,而不是使用時(shí)所在的對(duì)象;
化簡(jiǎn)規(guī)則:
Function 變成 =>堰酿;
只有1個(gè)參數(shù)可以省略小括號(hào);
沒(méi)有參數(shù)或者有多個(gè)參數(shù)不能省略小括號(hào)张足;
函數(shù)體內(nèi)只有一行可以省略大括號(hào)触创,如果有返回值return,則return也要省略为牍;
函數(shù)體內(nèi)有多行哼绑,不能省略大括號(hào); - 對(duì)象的簡(jiǎn)化賦值:對(duì)象賦值時(shí)如果屬性名和變量名一致可以簡(jiǎn)寫(xiě)
- 類(lèi)的支持:ES6中添加了對(duì)類(lèi)的支持碉咆,引入了class關(guān)鍵字凌那。JS本身就是面向?qū)ο螅珽S6中提供的類(lèi)實(shí)際上只是JS原型模式包裝∫魇牛現(xiàn)在有了class,對(duì)象的創(chuàng)建帽蝶,繼承更直觀,父類(lèi)方法的調(diào)用块攒,實(shí)例化励稳,靜態(tài)方法和構(gòu)造函數(shù)更加形象化。
JavaScript 中囱井,如何判斷兩個(gè)對(duì)象是否相等驹尼?
兩個(gè)Object類(lèi)型對(duì)象,即使擁有相同屬性庞呕、相同值新翎,當(dāng)使用 == 或 === 進(jìn)行比較時(shí),也不認(rèn)為他們相等住练。這就是因?yàn)樗麄兪峭ㄟ^(guò)引用(內(nèi)存里的位置)比較的地啰,不像基本類(lèi)型是通過(guò)值比較的。
//淺拷貝指向同一內(nèi)存的時(shí)候讲逛,此時(shí)兩個(gè)對(duì)象相等亏吝。
var obj1 = {
name: "xiaoming",
age: "18"
};
var obj2 = {
name: "xiaoming",
age: "18"
};
var obj3 = obj1;
console.log(obj1 === obj3); // true
console.log(obj2 === obj3); // false
說(shuō)說(shuō)你對(duì)promise的理解
Promise的含義:
promise是異步編程的一種解決方法。
所謂promise盏混,簡(jiǎn)單說(shuō)是一個(gè)容器蔚鸥,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果惜论,從語(yǔ)法上說(shuō),promise是一個(gè)對(duì)象止喷,從它可以獲取異步操作的消息馆类,promise提供了統(tǒng)一的API,各種異步操作都可以用同樣的方法進(jìn)行處理弹谁。
Promise對(duì)象的特點(diǎn):
(1)對(duì)象的狀態(tài)不受外界影響蹦掐,promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài)僵闯,pending(進(jìn)行中)卧抗、fulfilled(已成功)、rejected(已失敱钏凇)社裆。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài)向图,任何其他操作都無(wú)法改變這個(gè)狀態(tài)泳秀,這也是promise這個(gè)名字的由來(lái)“承若”;
(2)一旦狀態(tài)改變就不會(huì)再變榄攀,任何時(shí)候都可以得到這個(gè)結(jié)果嗜傅,promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled檩赢,從pending變?yōu)閞ejected吕嘀。這時(shí)就稱(chēng)為resolved(已定型)。如果改變已經(jīng)發(fā)生了贞瞒,你再對(duì)promise對(duì)象添加回調(diào)函數(shù)偶房,也會(huì)立即得到這個(gè)結(jié)果,這與事件(event)完全不同军浆,事件的特點(diǎn)是:如果你錯(cuò)過(guò)了它棕洋,再去監(jiān)聽(tīng)是得不到結(jié)果的。
有了Promise對(duì)象乒融,就可以將異步操作以同步操作的流程表達(dá)出來(lái)掰盘,避免了層層嵌套的回調(diào)函數(shù)。此外赞季,Promise對(duì)象提供統(tǒng)一的接口愧捕,使得控制異步操作更加容易。
Promise也有一些缺點(diǎn)碟摆。首先晃财,無(wú)法取消Promise,一旦新建它就會(huì)立即執(zhí)行典蜕,無(wú)法中途取消断盛。其次,如果不設(shè)置回調(diào)函數(shù)愉舔,Promise內(nèi)部拋出的錯(cuò)誤钢猛,不會(huì)反應(yīng)到外部。第三轩缤,當(dāng)處于pending狀態(tài)時(shí)命迈,無(wú)法得知目前進(jìn)展到哪一個(gè)階段(剛剛開(kāi)始還是即將完成)。
Promise的用法:
是一個(gè)構(gòu)造函數(shù)火的,這個(gè)構(gòu)造函數(shù)里有兩個(gè)參數(shù)壶愤,分別是:resolve(成功之后的回調(diào)函數(shù))、reject(失敗之后的回調(diào)函數(shù))馏鹤。
因?yàn)閜romise表示的是一個(gè)異步操作征椒,每當(dāng)我們new一個(gè)promise實(shí)例,就表示一個(gè)具體的異步操作湃累,那么這個(gè)異步操作的結(jié)果就只能有兩種狀態(tài):成功/失敗勃救,兩者都需要回調(diào)函數(shù)resolve/reject返回。所以內(nèi)部拿到操作的結(jié)果后治力,無(wú)法使用return把操作結(jié)果返回給調(diào)用者蒙秒,這時(shí)候只能用回調(diào)函數(shù)的形式來(lái)把成功或失敗的結(jié)果返回給調(diào)用者。
vue中watch和computed區(qū)別
監(jiān)聽(tīng)屬性watch
- 不支持緩存宵统,數(shù)據(jù)變晕讲,會(huì)直接觸發(fā)相應(yīng)的操作;
- watch支持異步马澈;
- 監(jiān)聽(tīng)數(shù)據(jù)必須是data中聲明過(guò)或者父組件傳遞過(guò)來(lái)的props中的數(shù)據(jù)益兄。
計(jì)算屬性computed
- 支持緩存,只有依賴數(shù)據(jù)發(fā)生改變箭券,才會(huì)重新進(jìn)行計(jì)算净捅;
- 不支持異步,當(dāng)computed內(nèi)有異步操作時(shí)無(wú)效辩块,無(wú)法監(jiān)聽(tīng)數(shù)據(jù)的變化蛔六;
- computed屬性值會(huì)默認(rèn)走緩存,計(jì)算屬性是基于他們的相應(yīng)依賴進(jìn)行緩存的废亭,也就是基于data中聲明過(guò)或者父組件傳遞的props中的數(shù)據(jù)通過(guò)計(jì)算得到的值国章。
Vue-router 中hash模式和history模式的區(qū)別
外觀:
hash模式url帶#號(hào),history模式不帶#號(hào)豆村。
功能:
hash模式url里面永遠(yuǎn)帶著#號(hào)液兽,開(kāi)發(fā)當(dāng)中默認(rèn)使用這個(gè)模式。如果用戶考慮url的規(guī)范那么就需要使用history模式,因?yàn)閔istory模式?jīng)]有#號(hào)四啰,是個(gè)正常的url宁玫,適合推廣宣傳;
比如我們?cè)陂_(kāi)發(fā)app的時(shí)候有分享頁(yè)面柑晒,那么這個(gè)分享出去的頁(yè)面就是用vue或是react做的欧瘪,咱們把這個(gè)頁(yè)面分享到第三方的app里,有的app里面url是不允許帶有#號(hào)的匙赞,所以要將#號(hào)去除那么就要使用history模式佛掖,但是使用history模式還有一個(gè)問(wèn)題就是,在訪問(wèn)二級(jí)頁(yè)面的時(shí)候涌庭,做刷新操作芥被,會(huì)出現(xiàn)404錯(cuò)誤,那么就需要和后端人配合坐榆,讓他配置一下apache或是nginx的url重定向拴魄,重定向到你的首頁(yè)路由上就ok了。
Vuex的相關(guān)知識(shí)
Vue生命周期
beforeCreate
實(shí)例初始化之后猛拴,this指向創(chuàng)建的實(shí)例羹铅,不能訪問(wèn)到data、computed愉昆、watch职员、methods上的方法和數(shù)據(jù),常用于初始化非響應(yīng)式變量跛溉。
created
實(shí)例創(chuàng)建完成焊切,可訪問(wèn)data、computed芳室、watch专肪、methods上的方法和數(shù)據(jù),未掛載到DOM堪侯,不能訪問(wèn)到ref屬性內(nèi)容為空數(shù)組,常用于簡(jiǎn)單的ajax請(qǐng)求伍宦,頁(yè)面的初始化芽死。
beforeMount
在掛載開(kāi)始之前被調(diào)用,beforeMount之前次洼,會(huì)找到對(duì)應(yīng)的template关贵,并編譯成render函數(shù)。
mounted
實(shí)例掛載到DOM上卖毁,此時(shí)可以通過(guò)DOM API獲取到DOM節(jié)點(diǎn)揖曾,$ref屬性可以訪問(wèn)
常用于獲取VNode信息和操作,ajax請(qǐng)求。
beforeupdate
響應(yīng)式數(shù)據(jù)更新時(shí)調(diào)用炭剪,發(fā)生在虛擬DOM打補(bǔ)丁之前练链,適合在更新之前訪問(wèn)現(xiàn)有的DOM,比如手動(dòng)移除已添加的事件監(jiān)聽(tīng)器念祭。
updated
虛擬 DOM 重新渲染和打補(bǔ)丁之后調(diào)用兑宇,組件DOM已經(jīng)更新碍侦,可執(zhí)行依賴于DOM的操作粱坤,避免在這個(gè)鉤子函數(shù)中操作數(shù)據(jù),可能陷入死循環(huán)瓷产。
beforeDestroy
實(shí)例銷(xiāo)毀之前調(diào)用站玄。這一步,實(shí)例仍然完全可用濒旦,this仍能獲取到實(shí)例株旷,常用于銷(xiāo)毀定時(shí)器、解綁全局事件尔邓、銷(xiāo)毀插件對(duì)象等操作晾剖。
destroyed
實(shí)例銷(xiāo)毀后調(diào)用,調(diào)用后梯嗽,Vue 實(shí)例指示的所有東西都會(huì)解綁定齿尽,所有的事件監(jiān)聽(tīng)器會(huì)被移除,所有的子實(shí)例也會(huì)被銷(xiāo)毀灯节。
理解vue的單向數(shù)據(jù)流
所有的 prop 都使得其父子 prop 之間形成了一個(gè)單向下行綁定:父級(jí) prop 的更新會(huì)向下流動(dòng)到子組件中循头,但是反過(guò)來(lái)則不行。這樣會(huì)防止從子組件意外改變父級(jí)組件的狀態(tài)炎疆,從而導(dǎo)致你的應(yīng)用的數(shù)據(jù)流向難以理解卡骂。
額外的,每次父級(jí)組件發(fā)生更新時(shí)形入,子組件中所有的 prop 都將會(huì)刷新為最新的值全跨。這意味著你不應(yīng)該在一個(gè)子組件內(nèi)部改變 prop。如果你這樣做了亿遂,Vue 會(huì)在瀏覽器的控制臺(tái)中發(fā)出警告浓若。
這里有兩種常見(jiàn)的試圖改變一個(gè) prop 的情形:
這個(gè) prop 用來(lái)傳遞一個(gè)初始值;這個(gè)子組件接下來(lái)希望將其作為一個(gè)本地的 prop 數(shù)據(jù)來(lái)使用崩掘。在這種情況下七嫌,最好定義一個(gè)本地的 data 屬性并將這個(gè) prop 用作其初始值:
props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}
這個(gè) prop 以一種原始的值傳入且需要進(jìn)行轉(zhuǎn)換。在這種情況下苞慢,最好使用這個(gè) prop 的值來(lái)定義一個(gè)計(jì)算屬性:
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
注意在 JavaScript 中對(duì)象和數(shù)組是通過(guò)引用傳入的诵原,所以對(duì)于一個(gè)數(shù)組或?qū)ο箢?lèi)型的 prop 來(lái)說(shuō),在子組件中改變這個(gè)對(duì)象或數(shù)組本身將會(huì)影響到父組件的狀態(tài)。
props: {
list: {
type: Array,
default: (() => [])
}
},
methods: {
addFn () {
this.list.push('newValue')
}
}
單向數(shù)據(jù)流:父級(jí) prop 的更新會(huì)向下流動(dòng)到子組件中绍赛,每次父級(jí)組件發(fā)生更新時(shí)蔓纠,子組件中所有的 prop 都將會(huì)刷新為最新的值。