一、vue相關
Q:vue的底層原理?
A:Vue是採用數據劫持配合發佈者-訂閱者模式,通過Object.defineProperty來()來劫持各個屬性的getter和setter。
在數據發生變化的時候,發佈消息給依賴收集器,去通知觀察者,做出對應的回調函數去更新視圖。
Q:vue3.0的新特性?
A:
1.代碼結構更清晰
2.壓縮包體積更小
3.Object.defineProperty 替換爲es6的 Proxy。 將原本對對象屬性的操作變爲對整個對象的操作,可優化性增強
4.啓用 TypeScript 語法,大大的簡化了代碼
Q:vue中computed和watch的區別
A:computed是通過幾個數據的變化,來影響一個數據,而watch,則是一個數據的變化,去影響多個數據。
詳細參考:https://blog.csdn.net/u011423258/article/details/88641870
Q:vue裏data爲什麼是函數而不是對象
A:如果寫成對象,當組件被複用時,那麼多個組件實例就會共用同一個data對象,這樣改變其中一個實例的data,就會改變所有的。
因此寫成函數返回值的形式,使每個組件實例都擁有自己的私有數據空間,不會造成混亂。
Q:vue裏數組改變爲什麼有的會渲染,有的不會渲染
A:對用數組的變異方法(push、pop、sort等)進行數組操作時可以達到視圖的重新渲染,因爲vue對這些方法進行了包裹。
Vue 不能檢測以下數組的變動:
- 利用索引直接設置一個數組項時
- 修改數組的長度時
因爲這樣的操作vue根本沒法做一個Object.defineProperty處理。
解決方法:vm.$set(vm.items, indexOfItem, newValue)
Q:update裏去改變data值會有問題嗎?
A:由於數據更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會調用update鉤子。應避免在此期間更改狀態,否則可能導致死循環。
Q:加載數據在created好還是在mounted好,兩者區別?
A:
在created比較好,如果在mounted鉤子函數中請求數據可能導致頁面閃屏問題。
兩者區別:
created:在模板渲染成html前調用,即通常初始化某些屬性值,然後再渲染成視圖。
mounted:在模板渲染成html後調用,通常是初始化頁面完成後,再對html的dom節點進行一些需要的操作。
Q:vue通信的幾種方式
A:
- props和$emit
- $parent 和 $children (另有:$root:獲取根實例)
- provide / inject
- ref / refs
- vuex(狀態管理器)
- localstorage和sessionStorage
Q:vue單向數據流
A:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。這樣會防止從子組件意外改變父級組件的狀態,從而導致你的應用的數據流向難以理解。
注意在 JavaScript 中對象和數組是通過引用傳入的,所以對於一個數組或對象類型的 prop 來說,在子組件中改變這個對象或數組本身將會影響到父組件的狀態。
Q:vue虛擬DOM的作用
A:速度快,減小了頁面渲染過程的次數
Q:vue服務端渲染
A:Vue.js 是構建客戶端應用程序的框架。默認情況下,可以在瀏覽器中輸出 Vue 組件,進行生成 DOM 和操作 DOM。然而,也可以將同一個組件渲染爲服務器端的 HTML 字符串,將它們直接發送到瀏覽器,最後將這些靜態標記"激活"爲客戶端上完全可交互的應用程序。
vue官方文檔:https://ssr.vuejs.org/zh/
Q:vue項目性能優化
A:
Q:vue中不用vuex如何實現在任意子組件都可以訪問一個全局的變量?
A:通過 $root 訪問根實例可實現。
vue官方說明:https://cn.vuejs.org/v2/guide/components-edge-cases.html#訪問根實例
二、js相關
Q:es5實現const變量申明方法
A:利用Object.defineProperty
function myConst (key, val) {
window.key = val
Object.defineProperty(window, key, {
enumerable: false,
configurable: false,
get: function () {
return val
},
set: function (value) {
if (value !== val) {
throw new TypeError('不能重複定義')
} else {
return val
}
}
})
}
詳細參考:https://blog.csdn.net/weixin_34362875/article/details/87941318
Q:async/await 如何做異常處理
A:
Q:對閉包的理解
A:閉包是這樣一種機制: 函數嵌套函數, 內部函數可以引用外部函數的參數和變量,參數和變量不會被垃圾回收機制所收回。
舉個簡單的例子:
function aa(){
var num=10;
function bb(){
num++
console.log(num);
}
return bb;
}
//bb(); //無法直接訪問函數內部的函數
aa()();//11
aa()();//11
aa()();//11
var closure = aa();
closure();//11
closure();//12
closure();//13
詳細參考:https://marco-hui.github.io/JavaScript-outline/guide/advanced/closure.html
Q:用過哪些ES6語法?
A:
- 變量聲明:let、const
- 解構賦值
- 字符串擴展:includes、startsWith/endsWith、repeat(n)、字符串模板
- 數組遍歷:for…of
- 合併對象:Object.assign(obj1,obj2,…objN)
- 箭頭函數
- Symbol數據類型
- Set集合
- Map映射
詳細參考:https://marco-hui.github.io/JavaScript-outline/guide/advanced/es6.html
Q:這是一道考察面試者包含變量定義提升、this指針指向、運算符優先級、原型、繼承、全局變量污染、對象屬性及原型屬性優先級等知識的JavaScript綜合能力題。請看題:
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//請寫出以下輸出結果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
A:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName(); //3
其他問題
這些是開放性的問題,根據自己的實際與經驗回答
Q:開發過程需注意的地方?
Q:有在學習或瞭解什麼新的技術嗎?
Q:對自己的職業規劃?
Q:你在項目團隊中是什麼角色?
Q:項目開發中遇到哪些比較難的問題?