1.有一種很方便的深克隆方式,不需要寫方法去遞歸芋绸。
let a = {
a1:[1,2,3],
a2:'string',
a3:{
name:'jack',
age:22
}
}
let b=JSON.parse(JSON.stringify(a)) //深克隆
let c = {...a} //淺克隆
先轉(zhuǎn)換成字符串重新開辟新的椕窖常空間,然后再轉(zhuǎn)換成對(duì)象即可摔敛,但是這種方式不可以轉(zhuǎn)換內(nèi)部有方法廷蓉,日期,正則表達(dá)式的對(duì)象马昙。
2.形參和實(shí)參的區(qū)別
var a = 1;
function func(b) { // 這里是函數(shù)定義桃犬,`b`就是形參
alert(b);
}
func(a); // 這里是函數(shù)調(diào)用`a`就是實(shí)參
實(shí)參(argument):
全稱為"實(shí)際參數(shù)"是在調(diào)用時(shí)傳遞給函數(shù)的參數(shù). 實(shí)參可以是常量、變量行楞、表達(dá)式疫萤、函數(shù)等, 無論實(shí)參是何種類型的量敢伸,在進(jìn)行函數(shù)調(diào)用時(shí)扯饶,它們都必須具有確定的值, 以便把這些值傳送給形參池颈。 因此應(yīng)預(yù)先用賦值尾序,輸入等辦法使實(shí)參獲得確定值。
形參(parameter):
全稱為"形式參數(shù)" 由于它不是實(shí)際存在變量躯砰,所以又稱虛擬變量每币。是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來接收調(diào)用該函數(shù)時(shí)傳入的參數(shù).在調(diào)用函數(shù)時(shí),實(shí)參將賦值給形參琢歇。因而兰怠,必須注意實(shí)參的個(gè)數(shù)梦鉴,類型應(yīng)與形參一一對(duì)應(yīng),并且實(shí)參必須要有確定的值揭保。
3.一道面試題
考點(diǎn)1:瀏覽器頁面加載時(shí)會(huì)生成執(zhí)行棧肥橙,每一個(gè)函數(shù)執(zhí)行時(shí)會(huì)把它的執(zhí)行上下文壓縮到棧內(nèi)存里,函數(shù)都是引用內(nèi)存秸侣,都放在堆里存筏,每個(gè)堆都有一個(gè)16進(jìn)制的地址。對(duì)象堆里存的是鍵值對(duì)味榛,函數(shù)堆里存的是函數(shù)的字符串椭坚。
考點(diǎn)2:a++,先運(yùn)算再自加,++a:先自加再運(yùn)算搏色。
let a =1,b=2;
console.log(a++) //1
console.log(a+b++) //4
console.log(a+(++b)) //6
事件隊(duì)列面試題
詳見阮一峰老師的http://www.ruanyifeng.com/blog/2015/05/async.html
async返回一個(gè)promise,等待await里面的函數(shù)執(zhí)行完畢后善茎,再執(zhí)行await后面的函數(shù)。如果await里面是異步函數(shù)也會(huì)等待其執(zhí)行完畢频轿,跳出async執(zhí)行別的微任務(wù)巾表,然后再回來執(zhí)行await后面的函數(shù)。如果await里面是普通同步函數(shù)略吨,則會(huì)立即執(zhí)行。
console.log('script start')
async function async1() {
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2 end')
return Promise.resolve().then(()=>{
console.log('async2 end1')
})
}
async1()
setTimeout(function() {
console.log('setTimeout')
}, 0)
new Promise(resolve => {
console.log('Promise')
resolve()
})
.then(function() {
console.log('promise1')
})
.then(function() {
console.log('promise2')
})
//script start => async2 end => Promise => script end => async2 end1 => promise1 => promise2 => async1 end => setTimeout
此時(shí)執(zhí)行完awit并不先把a(bǔ)wait后面的代碼注冊(cè)到微任務(wù)隊(duì)列中去考阱,而是執(zhí)行完await之后翠忠,直接跳出async1函數(shù),執(zhí)行其他代碼乞榨。然后遇到promise的時(shí)候秽之,把promise.then注冊(cè)為微任務(wù)。其他代碼執(zhí)行完畢后吃既,需要回到async1函數(shù)去執(zhí)行剩下的代碼考榨,然后把a(bǔ)wait后面的代碼注冊(cè)到微任務(wù)隊(duì)列當(dāng)中,注意此時(shí)微任務(wù)隊(duì)列中是有之前注冊(cè)的微任務(wù)的鹦倚。所以這種情況會(huì)先執(zhí)行async1函數(shù)之外的微任務(wù)(promise1,promise2)河质,然后才執(zhí)行async1內(nèi)注冊(cè)的微任務(wù)(async1 end). 可以理解為,這種情況下震叙,await 后面的代碼會(huì)在本輪循環(huán)的最后被執(zhí)行.
瀏覽器輸入網(wǎng)址發(fā)生了什么:
有關(guān)瀏覽器相關(guān)知識(shí)掀鹅,強(qiáng)緩存,協(xié)商緩存等等媒楼,必看
301乐尊,302,303重定向划址,304和重定向無關(guān)
https://mp.weixin.qq.com/s?__biz=MzI0MzIyMDM5Ng==&mid=2649825731&idx=1&sn=2c0835cebfee3a44e82d9efeb54f6e43&chksm=f175eb00c602621649fd46d7c9de87f7f08a4cdaa9e08808b938948584ca6977e24a5f5336ce&scene=21#wechat_redirect