1.js的基本資料類型(五種)
Number,String,Boolean,Undefined,Null
js的引用資料類型
三大引用類型:Object類型,Array類型,Function類型
除此之外,還有Date,Math,RegExp....
2.什麼是閉包?寫一個簡單的閉包。
閉包的本質是在一個函數的内部建立另一個函數,這樣在一個函數的内部也有權限通路另一個函數的變量。
在js的作用域環境中通路變量是由内向外的,内部作用域可以獲得目前作用域下的變量并且可以獲得包含目前作用域的外層作用域下的變量,反之則不能。也就是說在外層作用域下無法擷取記憶體作用域的變量。同樣,在不同的函數作用域中也是不能互相通路彼此變量的。
閉包因為函數内部包裹函數,作用域鍊得不到釋放,造成消耗記憶體。
閉包有三個優點:
1,保護函數内的變量安全,實作封裝,防止變量流入其他環境發生命名沖突。
2,在記憶體中維持一個變量,可以做緩存(但使用多了也是一項缺點,消耗記憶體)
3,匿名字執行函數可以減少記憶體消耗。
壞處也有兩個:
1,被引用的私有變量不能被銷毀,增大了記憶體消耗,造成記憶體洩露。
解決方法:可以在使用完變量後手動為它指派為null。
2,其次由于閉包涉及跨域通路,是以會導緻性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然後直接通路局部變量,來減輕對執行速度的影響。
解決方法:
立即執行函數,建立函數後立即執行。
IIFE
-頁面加載完成後執行一次的設定函數
-将設定函數中的變量包裹在局部作用域中,不會洩露成全局變量。
立即執行函數的兩種形式:
(function(){........} )()
(function(){.......}())
function fn(){
var num=3
return function(){
var n=0;
console.log(++n):
console.log(++num);
}}
var fn1=fn();
fn1();
fn1();
3.原型和原型鍊
js中有兩種原型,一種是顯式原型prototype(又稱為函數原型,隻有函數才有),另一種叫做隐式原型_proto_(又稱為對象原型)
prototype儲存着執行個體共享的方法,有一個指針constructor會指向構造函數
_proto_用于指向建立這個對象的函數的prototype,假如需要擷取這個對象的屬性或方法時,先在自身的屬性或方法上查找,假如找不到就會通過_proto_向上尋找,由此形成原型鍊。
4.作用域
作用域是在運作時代碼中的某些特定部分中變量,函數和對象的可通路性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見性
作用域包括:全局作用域、函數作用域、塊級作用域。
或者說1,在代碼中任何地方都能通路到的對象擁有全局作用域
2,函數作用域,是指聲明在函數内部的變量,和全局作用域相反,局部作用域一般隻在固定的代碼片段内可通路到,最常見的例如函數内部。
塊級作用域可通過新增指令 let 和 const 聲明,所聲明的變量在指定塊的作用域外無法被通路。塊級作用域在如下情況被建立:
- 在一個函數内部
- 在一個代碼塊(由一對花括号包裹)内部
5.this
this的指向在函數運作的時候才确定(誰調用的指向誰)。有4種情況:普通的this、作為對象方法、apply調用,this同級中有傳回值。
一,普通的this:指向調用這個函數的對象
二、作為對象方法:指向調用對象的父級
三、apply調用:指向apply()括号裡面的對象。
四、this同級中有傳回值:若傳回值是一個對象,this指向傳回對象,若不是,則指向函數的執行個體。
總之,誰調用指向誰;
- 作為普通函數調用 =>傳回window
- 使用call、apply、bind調用 =>傳什麼綁定什麼
- 作為對象方法調用=>傳回對象本身
- 在class方法中調用=>傳回目前執行個體本身
- this指向函資料以執行的環境對象,當在網頁的全局作用域中調用函數時,this對象指向的就是window,nodejs環境this對象指向的是global。this的取值與調用方式有關,一般情況下,如果使用"()"調用,那我們檢視"()"前是不是函數名,如果是繼續檢視函數名前有沒有"."如果有,"."前面的那個對象就是this,那麼this指向這個對象;如果不是指向全局對象(global/window)
6.call、apply、bind
.call apply改變this指向
.call(執行環境對象,實參清單);
.apply(執行環境對象,實參清單數組);
.bind(執行環境對象)(實參清單);
改變this指向,call和apply傳參形式不一樣,call傳入一個個參數,apply傳入一個數組,bind隻有在調用時才會生效。
7.淺拷貝和深拷貝的差別
淺拷貝基本資料類型拷貝的是值,引用類型拷貝的是位址,是以當值是引用類型時,新建立的值如果發送變化,那麼指針指向的内容也就發送變化,是以原來的值也就改變。
淺拷貝方法有:
- object.assign
- 擴充運算符let cloneObj = {…obj}
- concat運算符
- slice拷貝數組
- 手工實作
深拷貝指的是在記憶體中開辟一個新的空間,用來存放拷貝過來的值,新建立的值改變,不會影響到原有的值(因為它們不屬于同一個位址)
深拷貝方法:JSON.stringfy、手寫遞歸實作
數組和字元串方法有哪些
數組方法:
push,pop,shift,unshift,join,sort,concat,splice,slice
字元串方法
split,replace,concat,trim,indexOf,lastIndexOf,substr(提取字元串,可以規定被提取的長度),search(搜尋特定的值,傳回其位置)
數組周遊
for循環,for each,for of,for in