前端面試(我的收藏總結)HTML篇javascript
前端面試(我的收藏總結)CSS篇html
undefined
, null
, boolean
, string
, number
java
Ps:ES6中新增symbol
類型git
參考:JavaScript的數據類型及其檢測github
值類型面試
引用類型ajax
參考:低門檻完全理解JavaScript中的深拷貝和淺拷貝api
undefind、string、number、boolean、function、object數組
特別說明的是對象、數組、null都是object(函數雖是引用類型,但能識別),由於typeof無法區分引用類型
Ps:能夠獲得ES6中新增的symbol
類型
能夠用instanceof
關鍵字
舉個栗子:
var arr = []
arr instanceof Array //true
Array.isArray(arr) //true
複製代碼
雙等會自動強制轉換,有風險。
jQuery源碼中推薦使用三等,我我的也是這麼寫的。雙等可用於判斷布爾值
//構造函數方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
console.log(new Animal2())
//缺點:沒法繼承Animal的原型對象
//原型鏈方式
function Animal { this.name = 'pig' }
function Animal2 { this.age = 18 }
Animal2.prototype = new Animal();
console.log(new Animal2())
//缺點:其實是共享,修改原型對象裏的內容,其它繼承的類也會同步修改
//組合方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
Animal2.prototype = Animal.prototype;
console.log(new Animal2())
//缺點:因爲引用同一個原型對象,沒法區分對象是由誰實例化的
//最終方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
Animal2.prototype = Obiect.create(Animal.prototype);
Animal2.prototype.constructor = Animal2;
console.log(new Animal2())
//解釋:經過建立新的對象,再也不是同一個,再指定構造函數屬性爲本身
複製代碼
字面量
object對象
構造函數
object create
建立空對象,並繼承原型對象
執行構造函數,this指向這個空對象
若是返回值是object則返回新對象,不然返回object
在執行代碼時,變量和函數的聲明會被提高到做用域的頂部(此時變量的值爲undefined)
若是是全局,會被提高到腳本的最前面
若是是函數內,會被提高到函數內最前面,this也是
PS:注意函數表達式(匿名函數)的狀況
PS2:注意ES6中let
的狀況,不會變量提高
做爲構造函數執行
做爲對象屬性執行
做爲普通函數執行
call
apply
bind
for(var i=0;i<10;i++){
(function(i){
var a = document.createElement('a');
a.innerHtml=i+'<br>';
a.onclick=function(e){
e.preventDefault();
alert(i)
}
document.body.appendChild(a)
})(i)
}
複製代碼
只有函數做用域和全局做用域,ES6中新增塊級做用域那是後話
函數外聲明的變量爲全局做用域,函數內可使用
函數內聲明的變量爲函數做用域,函數外不可使用
做用域鏈:一個自由變量一直往上尋找(定義時的)父級做用域內的變量的過程。
自由變量:當前做用域沒有定義的變量
ps:花括號內使用let
聲明變量爲塊級做用域,只能內部使用,減小全局污染
閉包:用一個函數去訪問另外一個函數內的內部變量的方式的特殊函數
使用場景:柯里化函數
參考:mp.weixin.qq.com/s/G9HIJWH-5…
同步會阻塞代碼執行,異步不會
定時任務:setTimeout
setInverval
網絡請求:ajax請求,動態加載
事件綁定
參考:www.dailichun.com/2018/01/21/…
var random = Math.random();
var random = random+'00000000';
var random = random.slice(0,10);
複製代碼
function foreach(obj,fn){
var key;
if(obj instanceof Array){
obj.forEach(function(item,index){
fn(index,item)
})
}else{
for(key in obj){
fn(key,obj[key])
}
}
}
複製代碼
Date.now()
new Date().getTime()
+new Date()