記一次比較遙遠的面試提問,記得多少寫多少,附較詳細的解答,歡迎指出錯誤。面試
position: relative;
爲相對定位,根據自身位置來進行定位。position: absolute;
爲絕對定位,若父級節點的position
屬性不爲static
,則根據父級節點位置進行定位;不然則繼續尋找上一級position
屬性不爲static
的節點進行定位,若都沒有找到,則以視窗進行定位。this
的指向this
指向調用該函數的對象this
指向定義時所在的對象this
的指向能夠經過bind
函數改變this
指向因this
指向調用該函數的對象,而靜態方法不用建立實例來調用,而是經過類自己來直接調用,故this
指向這個類自己而不是實例。數組
let
、const
let
:undefined
。const
:let
的全部特性const
定義的常量指向的地址不能改變。會發生死循環問題,由於setState
又會觸發render
函數。shouldComponentUpdate
生命週期函數返回false
的時候不會觸發render
,能夠阻止這個問題發生。瀏覽器
PureCompoent在shouldComponentUpdate
實現一個淺比較,須要注意的是如下代碼不會觸發render
:緩存
const newState = this.state.someState;
newState.attr = 'newValue';
this.setState({
someState: newState,
});
複製代碼
這是由於淺比較是比較這個變量的地址,地址不變則返回false
。 下面代碼會觸發render
:服務器
const newState = this.state.someState;
newState.attr = 'newValue';
this.setState({
someState: {...newState},
});
複製代碼
還可使用immutable來寫,這裏使用的是immutable的一個輔助庫immutability-helper-x:函數
import update from 'immutability-helper-x';
...
this.setState({
someState: update.$set(this.state.someState, 'attr', 'newValue'),
});
複製代碼
淺拷貝就是把對象的屬性的值都複製一份到新的內存地址,但只複製一層,若屬性的值爲對象,則仍是原來的引用。如:ui
const obj = {
child: {
key: 'value',
},
};
const newObj = shallowCopy(obj);
console.log(newObj.child === obj.child); // true
複製代碼
實現方法:this
function shallowCopy(obj) {
// ES6
// return {...obj};
return Object.assign({}, obj);
}
複製代碼
而深拷貝則遍歷整個對象,把這個對象全部的值都移到新的內存空間,不存在原來的引用,如:spa
const obj = {
child: {
key: 'value',
},
};
const newObj = deepCopy(obj);
console.log(newObj.child === obj.child); // false
複製代碼
深拷貝能夠經過遍歷整個對象來拷貝,也有一種比較簡單的實現方法,但效率都比較差。線程
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
複製代碼
由於JS是單線程的,執行I/O操做時會阻塞線程,若是一直等待I/O操做完成再執行下面的代碼是不現實的,所以就須要事件循環。
事件循環就是當遇到像I/O這種阻塞線程的操做時,把他們交給系統內核去進行處理,Node繼續往下執行代碼,等到I/O操做執行完後告知Node,而後Node會把響應的回調函數加進事件隊列等待執行。
HTTP狀態碼爲200(from cache)
,它的優勢是沒有訪問服務器,直接在本地讀取緩存,減小HTTP請求,但也由於如此,這也是它的缺點,由於它不知道服務器資源是否有更新,從而沒法獲取到最新的資源,這個問題一般用給靜態資源添加Hash值來判斷資源有無更新,若Hash值不一樣,則會請求獲取最新資源。
相關Header有(按優先級排序):
Cache-Control
。設定一個最大有效期,如Cache-Control: max-age=36000000
Expires
。它描述一個最後的過時時間,如Expires: Tue, 17 Jul 2018 15:42:01 GMT
HTTP狀態碼爲304
,當沒有強緩存或者強緩存過時時,會發送請求到服務器,若服務器發現資源沒有更新,則返回304
告訴客戶端沒必要更新。由於它仍是要發送請求,因此比強緩存慢。
相關Header有:
Last-Modified
、If-Modified-Since
ETag
、If-None-Match
JS提供自動管理內存,稱爲「垃圾回收機制」,一般用的是「引用計數」,即當一個對象的引用數爲0時就把它釋放回收。而當一個不在使用的對象的引用數又不爲0的時候,沒法把他進行回收,即形成內存泄漏問題。