1 變量
2 === 與 ==
obj.a == null是obj.a === nul || obj.a === undefined簡寫
3 內(nèi)置函數(shù)
都可以使用new關(guān)鍵字
4 JSON
是一個js對象尚粘,也是一種數(shù)據(jù)格式
JSON.stringify({a:10,b:20})
JSON.parse("{'a':10,'b':20}")
5 如何判斷一個變量是數(shù)組類型
- instanceof 用于判斷引用類型屬于哪個構(gòu)造函數(shù)的方法
- Array.isArray(arr)
- Object.prototype.toString.call(arr) === "[object Array]"
6 原型規(guī)則和事例
- 所有的引用類型(數(shù)組、對象百炬、函數(shù)),都具有對象特性皆撩,即可以自由擴展屬性(除了null)
- 所有的引用類型(數(shù)組锭魔、對象、函數(shù))辜羊,都有一個隱式原型proto屬性笋除,屬性值是一個普通的對象
- 所有的函數(shù)斜友,都有一個顯示原型prototype屬性,屬性值也是一個普通對象
- 所有的引用類型(數(shù)組垃它、對象鲜屏、函數(shù)),隱式原型proto屬性值指向它的構(gòu)造函數(shù)的顯示原型prototype屬性值,類似指針
- 當試圖得到一個對象的某個屬性時国拇,如果這個對象本身沒有這個屬性洛史,那么會去它的proto(即它的構(gòu)造函數(shù)的prototype中尋找)
7 描述new一個對象的過程
- 創(chuàng)建一個新對象
- 將構(gòu)造函數(shù)的作用域給新對象(因此this指向了這個新對象)
- 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個新對象添加屬性)
- 返回新對象
8 變量提升,提升了2個東西
- 提升了變量定義
- 提升了函數(shù)聲明(注意和函數(shù)表達式的區(qū)別)
9 執(zhí)行上下文
- 變量提升時會涉及到執(zhí)行上下文的概念
- 一段<script>或者一個函數(shù)都會生成一個執(zhí)行上下文
- <script>會生成一個全局執(zhí)行上下文酱吝,執(zhí)行之前先提升變量定義也殖、函數(shù)聲明
- 函數(shù)會生成一個函數(shù)執(zhí)行上下文,函數(shù)執(zhí)行(不是定義之前)之前先提升變量定義务热、函數(shù)聲明毕源、this、arguments
- ps:注意“函數(shù)聲明“和“函數(shù)表達式“的區(qū)別
10 this幾種不同的使用場景
- 作為構(gòu)造函數(shù)執(zhí)行
- 作為對象屬性執(zhí)行
- 作為普通函數(shù)執(zhí)行
- call apply bind
this要在執(zhí)行時才能確認值陕习,定義時無法確認
11 創(chuàng)建10個<a>標簽,點擊的時候彈出來對應(yīng)的序號
// es6方法址愿,使用let
for (let index = 0; index < 10; index++) {
var aTag = document.createElement("a");
aTag.innerHTML = index + "<br>"
aTag.addEventListener("click", function (e) {
e.preventDefault();
console.log(index);
});
document.body.appendChild(aTag);
};
// es5方法
var createElement = function (i) {
var aTag = document.createElement("a");
aTag.innerHTML = i + "<br>"
aTag.addEventListener("click", function (e) {
e.preventDefault();
console.log(i);
});
return aTag
}
for (var i = 0; i < 10; i++) {
var a = createElement(i);
document.body.appendChild(a);
};
12 如何理解作用域
- 自由變量该镣,當前作用域沒有定義的變量,即“自由變量”
- 作用域鏈响谓,即自由變量的查找损合。當前作用域沒有定義這個變量省艳,會在這個函數(shù)定義時候的父級作用域繼續(xù)尋找這個變量,形成一個鏈式結(jié)構(gòu)
- 閉包的兩個場景嫁审,閉包的主要作用是封裝變量跋炕,收斂權(quán)限,防止函數(shù)外部對變量進行修改
// 函數(shù)作為返回值
function F1() {
var a = 100;
return function () {
console.log(a); // a是自由變量律适,在聲明時候的父級作用域?qū)ふ? }
}
var f1 = F1();
var a = 200;
f1();
// 函數(shù)作為參數(shù)傳遞
function F1() {
var a = 100;
return function () {
console.log(a); // a是自由變量辐烂,在聲明時候的父級作用域?qū)ふ? }
}
function F2(fn) {
var a = 200;
fn();
}
var f1 = F1();
F2(f1);
js沒有塊級作用域,只有函數(shù)和全局作用域捂贿,ES6中新增了塊級作用域纠修,僅針對于let、const聲明的變量
13 同步和異步的區(qū)別是什么厂僧?分別舉一個例子
- 同步會阻塞代碼執(zhí)行扣草,異步不會
- alert是同步,setTimeout是異步
14 前端使用異步的場景
定時任務(wù):setTimeout颜屠,setInterval
網(wǎng)絡(luò)請求:ajax請求辰妙,動態(tài)<img>加載
事件綁定