前端面試題1
技術標籤:面試題javascript面試
瀏覽器快取,有何區別?
• localStorage和sessionStorage一樣都是用來儲存客戶端臨時資訊的物件。他們均只能儲存字串型別的物件
• localStorage生命週期是永久,除非自己清除
• sessionStorage生命週期為當前視窗或標籤頁,一旦視窗或標籤頁被永久關閉了,那麼所有通過sessionStorage儲存的資料也就被清空了。
• LocalStorage 一般不會自動過期(除非使用者手動清除),而 SessionStorage 在會話結束時過期(如關閉瀏覽器)
常用的陣列API?
push、pop、unshift、shift、splice、slice、map、reduce、concat、filter、some、forEach、find、findIndex等
- push() 方法將一個或多個元素新增到陣列的末尾,並返回該陣列的新長度。
- unshift() 方法將一個或多個元素新增到陣列的開頭,並返回該陣列的新長度(該方法修改原有陣列)。
- pop()方法從陣列中刪除最後一個元素,並返回該元素的值。此方法更改陣列的長度。
- shift() 方法從陣列中刪除第一個元素,並返回該元素的值。此方法更改陣列的長度。
- splice() 方法通過刪除或替換現有元素或者原地新增新的元素來修改陣列,並以陣列形式返回被修改的內容。此方法會改變原陣列。
- slice() 方法返回一個新的陣列物件,這一物件是一個由 begin 和 end 決定的原陣列的淺拷貝(包括 begin,不包括end)。原始陣列不會被改變。
- map() 方法建立一個新陣列,其結果是該陣列中的每個元素是呼叫一次提供的函式後的返回值。
- concat() 方法用於合併兩個或多個數組。此方法不會更改現有陣列,而是返回一個新陣列。
- filter() 方法建立一個新陣列, 其包含通過所提供函式實現的測試的所有元素,不改變原有陣列。
- some() 方法測試陣列中是不是至少有1個元素通過了被提供的函式測試。它返回的是一個Boolean型別的值。
- forEach() 方法對陣列的每個元素執行一次給定的函式。返回值是undefined。
物件API
keys方法,用於遍歷物件可列舉屬性;create用於建立指定原型的新物件;getPrototypeOf用於獲取物件原型;definedProperty用於自定義物件是否可列舉,是否可寫等屬性。assign用於複製多個源物件屬性到目標物件等;
- Object.defineProperty() 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性,並返回此物件。通過Object.defineProperty()新增的屬性值不會被修改
const obj1 = {};
//給obj1物件新增一個propty1的屬性,並且值為42
Object.defineProperty(obj1, 'property1', {
value: 42,
writable: false
});
//雖然此時修改了property1的值,但是並沒有改變
obj1.property1 = 77;
console.log(obj1.property1);
// 打印出來的還是42
- Object.create()方法建立一個新物件,使用現有的物件來提供新建立的物件的__proto__。
- Object.keys() 方法會返回一個由一個給定物件的自身可列舉屬性組成的陣列(就是返回物件的下表組成的陣列),陣列中屬性名的排列順序和正常迴圈遍歷該物件時返回的順序一致 。
作用域和作用域鏈
作用域是變數和函式的作用範圍與生命週期,當在當前作用域查詢某變數時,如果沒找到就會去上層作用域找,此行為可以一直找到全域性物件window(非嚴格模式),而這個查詢過程也就是所謂的作用域鏈。
原型與原型鏈
Prototype原型
我們建立的每個函式都有一個 prototype(原型) 屬性,這個屬性是一個指標,指向一個物件,而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。
簡單來說,就是當我們建立一個函式的時候,系統就會自動分配一個 prototype屬性,可以用來儲存可以讓所有例項共享的屬性和方法
- 每一個建構函式都擁有一個 prototype 屬性,這個屬性指向一個物件,也就是原型物件
- 原型物件預設擁有一個 constructor 屬性,指向指向它的那個建構函式
- 每個物件都擁有一個隱藏的屬性 proto,指向它的原型物件
function Person(){}
var p = new Person();
p.__proto__ === Person.prototype // true
Person.prototype.constructor === Person // true
原型鏈
JavaScript 中所有的物件都是由它的原型物件繼承而來。而原型物件自身也是一個物件,它也有自己的原型物件,這樣層層上溯,就形成了一個類似連結串列的結構,這就是原型鏈
- 所有原型鏈的終點都是 Object 函式的 prototype 屬性
- Objec.prototype 指向的原型物件同樣擁有原型,不過它的原型是 null ,而 null 則沒有原型
總結 - 物件._ proto_ === 建構函式.prototype
- 一個物件的原型指的是這個物件與其他同類物件的公有屬性的集合
- 一個物件的原型的地址存在這個物件的__proto__屬性裡
- 每個物件都有原型,但除了「根物件Object.prototype比較特殊,Object.prototype這個物件的原型為null
閉包
閉包:如果一個函式用到了外部的變數,那麼這個函式加這個變數,就叫做閉包
閉包的作用:閉包常常用來‘間接訪問一個變數’。換句話說,隱藏一個變數。就是當你需要延長變數的生命週期的時候
優點:
-
可以避免使用全域性變數,防止全域性變數汙染
缺點: -
會造成記憶體洩漏(有一塊記憶體空間被長期佔用,而不被釋放)
學習的時光總是短暫,又到了時候說拜拜 歡迎關注公眾號 oldCode 獲取新鮮教程資料