面試題二

一、簡述一下你對閉包的理解
答:在js中函數(shù)可以訪問函數(shù)外部的變量的,但是在外部拿不到內部的變量,A一個函數(shù),B是A里面的子函數(shù),在B里面把A的變量return出去,再把B函數(shù)給return出去,如果我要用A里面的變量就可以直接調用B函數(shù)了,這個就是閉包。
閉包有兩個作用一個是保護,一個是保存。保護就是函數(shù)之間會形成一個私有作用域,不受外部干擾,很適合模塊開發(fā),在ES6和commonjs里都可以看到閉包的影子。保存就是當一個函數(shù)返回另一個引用數(shù)據(jù)類型的時候,被外界所接受了就會形成一個不銷毀的作用域,它就會一直存在在堆內存里,很容易造成內存泄漏。內存泄漏是瀏覽器的垃圾回收機制無法回收的內存,比如說一個對象或者一個數(shù)組。
二、閉包的優(yōu)缺點
答:優(yōu)點:可訪問函數(shù)內部的變量,防止變量污染作用域(隱藏變量),從而實現(xiàn)封裝。
缺點:本來局部變量會被垃圾回收機制給回收的,但是我們給返回到外面了,并且在引用的情況下,是不回被回收的,會造成內存的一些浪費
三、ES6、7的新特性?
答:ES6:1、支持let和const。2、剪頭函數(shù)。3、類(class)。4、函數(shù)參數(shù)默認值。5、模塊化module。6、模版字符串。7、解構賦值。8、延展操作符。9、對象屬性簡寫。10、promise。11、新增數(shù)組方法。12、數(shù)值的擴展方法。
ES7:1、includes():該方法的第二個參數(shù)表示搜索的起始位置,默認為0.如果第二個參數(shù)為負數(shù),則表示倒數(shù)的位置,如果這時它的絕對值大于數(shù)組長度(比如第二個參數(shù)為-4,但是數(shù)組長度為3),則會重置從0開始。

[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

2、指數(shù)運算符:它與Math.pow(a,b)相同。這個運算符的一個特點是右結合。而不是常見的左結合。多個指數(shù)運算符連用時,是從最右邊開始計算的。

// 相當于 2 ** (3 ** 2)
2 ** 3 ** 2
// 512

let a = 1.5;
a **= 2;
// 等同于 a = a * a;
let b = 4;
b **= 3;
// 等同于 b = b * b * b;

四、ES6里面的class是怎么繼承的?(不會)
答:Class可以通過extends關鍵字實現(xiàn)繼承。
五、聊一下this指向,構造函數(shù)的this指向呢?
答:1、this總是指向函數(shù)的直接調用者。2、如果有new關鍵字,this指向new出來的那個對象。3、在MOD實踐中,this指向目標元素。4、箭頭函數(shù)的this指向它所在的函數(shù)作用域,并且不能改變,始終指向的是window。
六、computed和watch的區(qū)別
答:computed支持緩存,值發(fā)生改變時才觸發(fā),watch是一直監(jiān)聽;computed不支持異步,watch支持;如果當前的這個值是通過別的值計算過來的建議使用computed,如果當這個值發(fā)生變化時要執(zhí)行一些操作建議使用watch;computed屬性值是函數(shù),那么會默認走get方法,函數(shù)的返回值就是當前的值,在computed中,屬性都有一個get和set方法,當數(shù)據(jù)發(fā)生變化時,調用set方法。watch監(jiān)聽的數(shù)據(jù)必須得是聲明過的,當數(shù)據(jù)發(fā)生變化時,觸發(fā)其他操作,函數(shù)有兩個參數(shù),
immediate:組件加載立即觸發(fā)回調函數(shù)執(zhí)行,
deep: deep的意思就是深入觀察,監(jiān)聽器會一層層的往下遍歷,給對象的所有屬性都加上這個監(jiān)聽器,但是這樣性能開銷就會非常大了,任何修改obj里面任何一個屬性都會觸發(fā)這個監(jiān)聽器里的方法。
使用場景:
computed:
    當一個屬性受多個屬性影響的時候就需要用到computed
    最典型的栗子: 購物車商品結算的時候
watch:
    當一條數(shù)據(jù)影響多條數(shù)據(jù)的時候就需要用watch
    栗子:搜索數(shù)據(jù)
七、route和router的區(qū)別(不會)
答:route是路由信息對象,里面主要包含路由的一些基本信息,包括name、meta、path、hash、query、params、fullPath、matched、redirectedFrom。
router是VueRouter的實例,包含了一些路由的跳轉方法,鉤子函數(shù)等。
鉤子函數(shù):beforeRouteEnter(路由進入前)參數(shù):to: 路由將要跳轉的路徑信息,信息是包含在對象里邊的。from: 路徑跳轉前的路徑信息,也是一個對象的形式。next: 路由的控制參數(shù),常用的有next(true)和next(false)。
beforeRouteUpdate(路由改變前)
beforeRouteLeave(路由離開前)
八、vue路由傳參有幾種方法
答:1、通過query方式傳參。2、通過params方式傳參。3、直接在路由地址后面拼接參數(shù)。
query和params區(qū)別
1、用法上的
query要用path來引入,params要用name來引入,接收參數(shù)都是類似的,分別是this.route.query.name和this.route.params.name。
注意接收參數(shù)的時候,已經(jīng)是route而不是router了哦!
2、展示上的
query更加類似于我們ajax中get傳參,params則類似于post,說的再簡單一點,前者在瀏覽器地址欄中顯示參數(shù),后者則不顯示。
使用query傳參的話,會在瀏覽器的url欄看到傳的參數(shù)類似于get 請求,使用params傳參的話則不會,類似于post請求。
如果提供了path,params將會被忽略(即如果要使用params傳參, 則一定要使用name),但是query不屬于這種情況。如果使用完整 路徑和query傳參,刷新頁面時不會造成路由傳參的參數(shù)丟失。
九、Vue.nextTick知道是什么嗎? 答:獲取更新后的DOM。使用場景:在使用echats的時候從后臺獲取的數(shù)據(jù)有可能發(fā)生延遲,無法在echarts渲染前拿到,就可以使用nextTick。
十、keep-alive是什么?
答:避免重復渲染的一個標簽,但是它本身不回渲染到dom上。利用場景:用戶在某個列表頁面選擇篩選條件過濾出一份數(shù)據(jù)列表,由列表頁面進入數(shù)據(jù)詳情頁面,再返回該列表頁面,我們希望:列表頁面可以保留用戶的篩選(或選中)狀態(tài)。
十一、Vue2和3的區(qū)別(不會)
https://www.cnblogs.com/cxddgz/p/13153570.html
十二、promise的參數(shù)有什么,分別是什么作用?
答:是異步隊列的一種解決方案,promise有三種狀態(tài),1、pending(待定)出事狀態(tài)。2、fulfilled(實現(xiàn))操作成功。3、rejected(被否決)操作失敗。
局限性:
首先,無法取消Promise,一旦新建它就會立即執(zhí)行,無法中途取消。
其次,如果不設置回調函數(shù),Promise內部拋出的錯誤,不會反應到外部。
第三,當處于pending狀態(tài)時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
當接收到一個代表錯誤的 HTTP 狀態(tài)碼時,從 fetch() 返回的 Promise 不會被標記為 reject, 即使響應的 HTTP 狀態(tài)碼是 404 或 500。相反,它會將 Promise 狀態(tài)標記為 resolve (但是會將 resolve 的返回值的 ok 屬性設置為 false ),僅當網(wǎng)絡故障時或請求被阻止時,才會標記為 reject。
all()方法:promise的all方法提供并執(zhí)行異步操作的能力,并且在所有異步操作執(zhí)行完成才執(zhí)行回調

//買作業(yè)本
        function cutUp(){
            console.log('挑作業(yè)本');
            var p = new Promise(function(resolve, reject){ //做一些異步操作
                setTimeout(function(){
                    console.log('挑好購買作業(yè)本');
                    resolve('新的作業(yè)本');
                }, 1000);
            });
            return p;
        }

        //買筆
        function boil(){
            console.log('挑筆芯');
            var p = new Promise(function(resolve, reject){ //做一些異步操作
                setTimeout(function(){
                    console.log('挑好購買筆芯');
                    resolve('新的筆芯');
                }, 1000);
            });
            return p;
        }
 Promise.race([cutUp(), boil()]).then(function(results){
    console.log("哈哈,我先買好啦");
     console.log(results);
 });

race()方法:race方法和all用法一樣,只要有一個異步操作執(zhí)行完畢,就立刻執(zhí)行 then 回調。

只要有一個異步操作執(zhí)行完畢,就立刻執(zhí)行 then 回調

十三、const 可不可以修改?
基本數(shù)據(jù)類型不可以修改,但是定義的對象是可以通過對象屬性來改變值的,例如:

const aaaaaa={aa:'dd'}
aaaaaa.aa='bb'
console.log(aaaaaa);//

十四、get和post的區(qū)別?
答:1、傳輸數(shù)據(jù)的長度限制是不一樣的,get傳參的位置是在url里面的,一般瀏覽器限制大小是2k,post因為是在header的body里面的,所以對長度就沒有限制。傳輸數(shù)據(jù)大小其實是可以改變的,瀏覽器的參數(shù)是可以配置的。2、從安全性來說,因為get的參數(shù)是拼接在url里的是,post是放在body里的,get方式的參數(shù)還會被緩存,會存在歷史記錄中,post不會,所以post要比get相對安全。3、get和post編碼方式不同,用post的話會設置一下header的請求頭,它的類型是form-data,get的是form-urlencoded。也有人把get請求傳參放在body里的,也有人把post請求放在url里的,但是不符合接口傳輸規(guī)范。除了這兩種方式還有put請求,是為了修改數(shù)據(jù)的,還有delete請求,是為了刪除數(shù)據(jù)的。
十五、如何用css畫出一個三角形?
答:

#triangle-up {
width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid red;
}

十六、Vue生命周期
答:四個階段,創(chuàng)建階段、掛載階段、更新階段、刪除階段
八個鉤子函數(shù),創(chuàng)建前beforeCreat、創(chuàng)建后created、掛載前beforeMount、掛載后mounted、更新前beforeUpdate、更新后update、銷毀前beforeDestroy、銷毀后destroyed,前四個是主動觸發(fā)的,后四個是要被動觸發(fā)的。
十七、談談eval的理解?
答:這個一個完整的js解釋器,把代碼寫進去他會幫忙執(zhí)行,正是這樣它執(zhí)行效率特別慢,要編譯一次再執(zhí)行一次,eval聲明的變量不會變量提升

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容