(1)異步與單線程,(運行機制類)
console.log(100);
setTimeout(function() {
console.log(200);
}, 0);
console.log(300);
//100 -> 300 -> 200
console.log('a');
while(true){}
console.log('b'); //a
遇到setTimeout,里面的函數(shù)會被暫存起來期丰,等到所有的同步任務(wù)執(zhí)行完了再來執(zhí)行
(2)事件綁定通用函數(shù)
html
<div class="wrap">
<li>我是一號</li>
<li>俺是二號</li>
<li>咱是三號</li>
</div>
js
function bindEvent(elem,eventType,aim,fn){
if(fn == null){
fn = aim;
aim = null;
}
var target;
elem.addEventListener(eventType,function(e){
target = e.target;
if(aim){
if(target.matches(aim)){
fn.call(target,e);
//this指向target
}
}else{
fn(e)
}
})
}
var wrap = document.querySelector('.wrap');
bindEvent(wrap,'click',function(e){
//console.log(this);
//console.log(this.innerHTML);
console.log(e.target.nodeName);
})
(3)閉包
什么是閉包而姐?
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
閉包的用途
可以讀取函數(shù)內(nèi)部的變量惹想,另一個就是讓這些變量的值始終保持在內(nèi)存中
閉包的兩種形式马昙,函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞
兩種形式
//函數(shù)的作用域是在定義時確定的恋拍,this的指向是在調(diào)用時確定的
function earth(){
var river = 20000;
return function(){
console.log(river);
}
}
var river = 0;
var earth1 = earth();
earth1();
function universe(fn){
var river = 1;
fn();
}
universe(earth1);
//20000
//20000
demo
var name = "godv";
var hero = {
name:"weidapao",
getName:function(){
return function(){
return this.name;
}
}
}
//console.log(hero.getName()()); godv
var weiwei = hero.getName();
console.log(weiwei());
/**************************************/
var card_name = "lks";
var card_hero = {
card_name:"dk_lks",
getName:function(){
var that = this;
return function(){
return that.card_name;
}
}
}
console.log(card_hero.getName()()); dk_lks
(4)遍歷數(shù)組與對象的通用函數(shù)
function forEachArrOrObj(obj,fn){
var key;
if(obj instanceof Array){
obj.forEach(function(item,index){
fn(item,index);
})
}else{
for(key in obj){
fn(key,obj[key])
}
}
}
//var score = [88,90,100];
var score = {"語文":88,
"數(shù)學":89,
"英語":100}
forEachArrOrObj(score,function(item,index){
console.log(item,index)
})
(6)類型轉(zhuǎn)換
6種會被轉(zhuǎn)換為false,空字符串藕甩, 0施敢, false , NaN , null , nudefined
雙等號會進行隱式類型轉(zhuǎn)換
(7)構(gòu)造函數(shù)與原型鏈
new一個對象的過程
將this賦給一個空對象,向空對象里面加入屬性辛萍,返回這個對象悯姊,賦值給對象變量
五條原型規(guī)則
var Spider = function(){}
var spiderman = new Spider();
spiderman.__proto__ == Spider.prototype //true
原型鏈
(8)如何準確判斷數(shù)組類型
instanceof
instanceof 用于判斷一個對象是否是特定構(gòu)造函數(shù)的實例
判斷邏輯是 arr.proto一層層往上,能否找Array.prototype
存在的問題是當網(wǎng)頁中包含多個框架贩毕,那實際上就存在多個不同的全局環(huán)境悯许,從而存在不同版本的Array構(gòu)造函數(shù)。如果從一個框架向另一個框架傳入一個數(shù)組辉阶,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)先壕,就需要使用第三種方法,使用object的toString()
var arr = [];
arr instanceof Array //true
Object.prototype.toString.call(array)
function isArray(arr){
return Object.prototype.toString.call(arr) === "[object Array]";
}
var arr = [1,2,3];
console.log(isArray(arr)); //true
function isArraytwo(arr){
return Object.prototype.toString.call(arr).slice(8,-1).toLowerCase();
}
console.log(isArraytwo(arr)); //array
console.log(isArraytwo({})); //object
然后就是使用es5新增的Array.isArray( [ ] )方法
(9)得到函數(shù)參數(shù)的方法
function getParams(){
return Array.prototype.slice.call(arguments); //es5
}
function getParams_es6(...res){ //es6
return res;
}
console.log(getParams_es6(1,2,3,4,5,6));
console.log(typeof getParams_es6(1,2,3,4,5,6)) //object
console.log(getParams(1,2,3,4,5,8));
console.log(typeof getParams('wa','ha')); //object
(10)前后端分離
前后端的分離方式分為部分分離和全部分離兩種谆甜,部分分離是只把腳本和樣式分離出去垃僚,而html模板還留在后端通過jsp,velocity或者freemarker來渲染规辱;另一種就是完全分離谆棺,腳本樣式以及模板全都放在前端來維護
完全分離的方式,就是把純靜態(tài)的html模板完全放在前端罕袋,數(shù)據(jù)全部通過RESTful接口來進行交互改淑。這樣前后端就完全分開了碍岔,脫離了后端的模板,而這種方式的系統(tǒng)復雜度也會比第一種完全分離的方式低朵夏。但這種方案下蔼啦,所有的頁面數(shù)據(jù)都是用js渲染的,沒有動態(tài)模板仰猖,不太利于SEO捏肢。這個不足我們可以通過做server render或者給蜘蛛做一套定制頁面來解決
什么是前后端分離
- 前端專注業(yè)務(wù)邏輯,后端負責接口與數(shù)據(jù)
- 前端 處理更多的交互邏輯與路由跳轉(zhuǎn)
- 是web應(yīng)用的一種架構(gòu)模式
- 在前后端分離架構(gòu)中饥侵,后端只需要負責按照約定的數(shù)據(jù)格式向前端提供可調(diào)用的API服務(wù)即可鸵赫。前后端之間通過HTTP請求進行交互,前端獲取到數(shù)據(jù)后躏升,進行頁面的組裝和渲染奉瘤,最終返回給瀏覽器
前后端分離的好處
- 實現(xiàn)了前后端的并行開發(fā)
- 提升了用戶體驗,前端來拼接模板煮甥,減少加載時間
- 接口可以給多種客戶端使用(PC 盗温,移動)
需要前后端分離的業(yè)務(wù)場景
(12)事件流
事件流描述的是從頁面中接收事件的順序
(13)&&與||
&&操作符總結(jié):只要一個false就取false的值,都是true取后面成肘,都是false取前面
||操作符總結(jié):只要一個是true就取true的值卖局,都是true取前面,都是false取后面
(14)任務(wù)隊列
單線程
所有任務(wù)可以分成兩種双霍,一種是同步任務(wù)(synchronous)砚偶,另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是洒闸,在主線程上排隊執(zhí)行的任務(wù)染坯,只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù)丘逸;異步任務(wù)指的是单鹿,不進入主線程、而進入"任務(wù)隊列"(task queue)的任務(wù)深纲,只有"任務(wù)隊列"通知主線程仲锄,某個異步任務(wù)可以執(zhí)行了,該任務(wù)才會進入主線程執(zhí)行
所有的程序都是在主進程中執(zhí)行的湃鹊,不管是同步還是異步任務(wù)儒喊,只是在異步隊列中進行等待輪詢
異步任務(wù)的運行機制
- 所有同步任務(wù)都在主線程上執(zhí)行,形成一個執(zhí)行棧(execution context stack)
- 主線程之外币呵,還存在一個"任務(wù)隊列"(task queue)怀愧。只要異步任務(wù)有了運行結(jié)果,就在"任務(wù)隊列"之中放置一個事件
- 一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會讀取"任務(wù)隊列"芯义,看看里面有哪些事件肛搬。那些對應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài)毕贼,進入執(zhí)行棧,開始執(zhí)行
- 主線程不斷重復上面的第三步,主線程空了蛤奢,就會去讀取"任務(wù)隊列"
(15)事件代理
事件的三個階段:捕獲鬼癣,目標,冒泡
事件代理的原理:事件的冒泡機制
事件代理的優(yōu)點:減少事件綁定啤贩,可以比如在table上代理所有td的click事件待秃,為新增的子節(jié)點綁定事件
(16)slice與splice的區(qū)別
splice() 方法向用于從數(shù)組中添加/刪除項目,然后返回被刪除的項目痹屹,會修改原數(shù)組,返回的是被刪除的項組成的數(shù)組
(17)組件化理解
(18)forEach的中斷章郁??志衍?
- return false只是退出當前循環(huán)
- 不能進行break
- try catch