成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS核心知識(shí)歸納

Binguner / 2498人閱讀

摘要:引用類型,的值是對(duì)象,棧內(nèi)存中存放地址指向堆內(nèi)存中的對(duì)象。作刪除使用,不傳入數(shù)據(jù)既可。者相互獨(dú)立,互不干擾。在某種情況下,方式會(huì)帶來(lái)嚴(yán)重的安全問題。請(qǐng)求結(jié)果無(wú)持續(xù)性的副作用。

整理進(jìn)行中,如有不正,煩請(qǐng)?zhí)岢觯x謝了。

JS基礎(chǔ) 1.數(shù)據(jù)類型?

6基本數(shù)據(jù)類型: Undefined, Null, Boolean, Number, String ,Symbol
引用類型: Array Object Date Function

區(qū)別:
基本類型值保存在??臻g,我們通過按值來(lái)訪問的。
引用類型,的值是對(duì)象,棧內(nèi)存中存放地址指向堆內(nèi)存中的對(duì)象。是按引用訪問的。棧內(nèi)存中存放的只是該對(duì)象的訪問地址,在堆內(nèi)存中為這個(gè)值分配空間。
1.基本數(shù)據(jù)類型不可以添加/刪除屬性和方法;
2.復(fù)制的方式不同;引用類型復(fù)制的時(shí)候,復(fù)制的是指針,2個(gè)變量實(shí)際指的是同一個(gè)對(duì)象。
3.函數(shù)的參數(shù)是按值傳遞的
檢測(cè)數(shù)據(jù)類型 typeof instanceof
轉(zhuǎn)型數(shù)據(jù)類型

顯式:Boolean()/Number()/pareseInt()/pareseFloat()/toString()/String()
隱私: +、 賦值

區(qū)別: undefined與null 的區(qū)別

null:

是Null類型的值.
是個(gè)空值,空對(duì)象指針.
typeof null,結(jié)果為Object;
null用來(lái)表示尚未存在的對(duì)象.

undefined :

是Undefined類型的值。
typeof undefined,結(jié)果為undefined;
一個(gè)聲明了變量,但未初始化值,結(jié)果就是undefined
沒有返回值的函數(shù),返回的也是undefined,
沒有實(shí)參的形參也是undefined;

symbol
表示獨(dú)一無(wú)二的值
Symbol 值通過Symbol函數(shù)生成
對(duì)象的屬性名現(xiàn)在可以有兩種類型,一種是原來(lái)就有的字符串,另一種就是新增的 Symbol 類型
Symbol函數(shù)前不能使用new命令,否則會(huì)報(bào)錯(cuò)。這是因?yàn)樯傻?Symbol 是一個(gè)原始類型的值,不是對(duì)象
由于 Symbol 值不是對(duì)象,所以不能添加屬性。基本上,它是一種類似于字符串的數(shù)據(jù)類型
Symbol函數(shù)的參數(shù)只是表示對(duì)當(dāng)前 Symbol 值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不相等的。因?yàn)閟ymbol的每個(gè)值不相等。
Symbol 值不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)
Symbol 值可以顯式轉(zhuǎn)為字符串。
Symbol 值也可以轉(zhuǎn)為布爾值,但是不能轉(zhuǎn)為數(shù)值
Symbol 值作為對(duì)象屬性名時(shí),不能用點(diǎn)運(yùn)算符。

2.面向?qū)ο螅?/b>

何為面向?qū)ο?/strong>
? 萬(wàn)物皆對(duì)象,
? 對(duì)象又有如下特點(diǎn): 
? 抽象:抓住核心問題
? 封裝:只能通過對(duì)象來(lái)訪問方法
? 繼承:從已有的對(duì)象下繼承出新的對(duì)象
? 多態(tài):多對(duì)象的不同形態(tài)
創(chuàng)建對(duì)象的5種方式
? 1.工廠方式創(chuàng)建對(duì)象:面向?qū)ο笾械姆庋b函數(shù)(內(nèi)置對(duì)象)
? 2.構(gòu)造函數(shù)創(chuàng)建對(duì)象
? 優(yōu)點(diǎn):創(chuàng)建自定義函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型,這是構(gòu)造函數(shù)勝過工廠模式的地方
? 缺點(diǎn):每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍
? 3、對(duì)象字面量方式創(chuàng)建對(duì)象
? 4、用原型方式 
? 1、優(yōu)點(diǎn):可以讓所有的對(duì)象實(shí)例共享它所包含的屬性和方法
? 2、缺點(diǎn):原型中是所有屬性都是共享的,但是實(shí)例一般都是要有自己的多帶帶屬性的。所以一般很少多帶帶使用原型模式。
? 5.混合模型:構(gòu)造函數(shù)模式定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性
總結(jié):使用上述的混合法

3.Array

數(shù)組的增加

array.push()   向數(shù)組末尾添加元素,返回的是添加后新數(shù)組的長(zhǎng)度,原有數(shù)組改變
array.unshift()  向數(shù)組開頭添加元素,返回的是添加后新數(shù)組的長(zhǎng)度,原有數(shù)組改變
array.splice(n,m)   從索引n開始刪除m個(gè)元素,把刪除的內(nèi)容當(dāng)做新數(shù)組返回,原有數(shù)組
array.concat()
// ES6的合并數(shù)組
[...arr1, ...arr2, ...arr3]
Array.prototype.push.apply(arr1,arr2);)----將arr2追加到arr1中,返回?cái)?shù)組的長(zhǎng)度


數(shù)組的刪除

array.pop() 刪除數(shù)組的最后一項(xiàng),返回的是刪除的那一項(xiàng),原有數(shù)組改變
array.shift() 刪除數(shù)組的的第一項(xiàng),返回的是刪除的那一項(xiàng),原有數(shù)組改變
splice(n,m,x) 從索引n開始刪除m個(gè)元素,然后插入元素x,把刪除的內(nèi)容當(dāng)做新數(shù)組返回,原有數(shù)組改變。作刪除使用,x不傳入數(shù)據(jù)既可。
slice(n,m) 從索引n開始刪除m個(gè)元素,返回刪除項(xiàng),原數(shù)組不變
length   減小數(shù)組的長(zhǎng)度,實(shí)際是從數(shù)組尾部刪除元素,改變?cè)瓟?shù)組。

其實(shí)只有一種 splice(),但delete方法,我個(gè)人感覺算修改不屬于刪除,詳情請(qǐng)見實(shí)例

indeOf() 
lastIndexOf()
find()
findIndex()
includes()
[1, 4, -5, 10].find((n) => n < 0)    // -5
[1, 4, -5, 10].findIndex((n) => n < 0)    // 2
[1, 2, 3].includes(2)     // true

排序
array.reverse() 把數(shù)組倒過來(lái)排序,原有數(shù)組改變
array.sort() 可以實(shí)現(xiàn)由大到小或者由小到大的排序 但是直接寫sort只能排序十以內(nèi)的數(shù)字

3.1類型轉(zhuǎn)換

數(shù)組 對(duì)象 字符串 的轉(zhuǎn)換;

array -->string:

join("+") 把數(shù)組的每一項(xiàng)拿出來(lái)用指定分隔符隔開 ;
tostring 把數(shù)組的每一項(xiàng)拿出來(lái)用逗號(hào)隔開,原有數(shù)組不變

obj --> string

JSON.parse(); //可以將json字符串轉(zhuǎn)換成json對(duì)象
JSON.stringify(); //可以將json對(duì)象轉(zhuǎn)換成json對(duì)符串    

string-->array:

split(“,”)

obj --> array:

For… in循環(huán)賦值法
Array.from()

number --> array

Array.of()

string --> number (4種)

Number() 
parseFloat()  //  如果parseInt()和parseFloat()不能夠把指定的字符串轉(zhuǎn)換為數(shù)字,它們就會(huì)返回NaN  parseInt(""eleven"); // Returns Nan 
parseInt()  // parseInt()是取整,即丟棄小數(shù)部分,保留整數(shù)部分 parseInt(2.7) ==>3 
+number // var c = +"2"  typeof c ---number

string <-- number (4種)
var c = String(number)
var c = number + ""
var c = number.toString(8) // 將number 轉(zhuǎn)換成8進(jìn)制的數(shù)字 且c的類型是string
var c = number.toFixed(1); //數(shù)字轉(zhuǎn)換為字符串,并且顯示小數(shù)點(diǎn)后的指定的位數(shù) 例 number = 123.476,則c= 123.5"

深淺拷貝
對(duì)象和數(shù)組的拷貝有兩種
淺拷貝即 拷貝了指針指向,當(dāng)一個(gè)對(duì)象的值改變會(huì)影響另一個(gè)對(duì)象的值。
深拷貝, 拷貝的是真正的值。2者相互獨(dú)立,互不干擾。
淺拷貝的方法4種方法
slice() concat() 賦值法 遍歷
注:concat 和 slice 對(duì)一維數(shù)組 能算是深拷貝;2維的 是淺拷貝

var  a= [1,2,3,4]
b= a.concat();
c=a.concat();
b[0] = 5;
c[0] = 6;
a // [1,2,3,4]
b // [5,2,3,4]
c // [6,2,3,4]
var  aa= [[1,1],[2,2],3,4]
bb= aa.concat();
cc=aa.concat();
bb[1][0] = 5;
cc[0] = 6;
aa // [[1,1],[5,2],3,4]
b // [[1,1],[5,2],3,4]
c // [6,[5,2],3,4]
var shallowCopy = function(obj) {

// 只拷貝對(duì)象
if (typeof obj !== "object") return;
// 根據(jù)obj的類型判斷是新建一個(gè)數(shù)組還是對(duì)象
var newObj = obj instanceof Array ? [] : {};
// 遍歷obj,并且判斷是obj的屬性才拷貝
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        newObj[key] = obj[key];
    }
}
return newObj;
}

深拷貝的方法5種方法:
一維數(shù)組和對(duì)象的concat slice法 JSON.parse(JSON.stringify(arr)) 和遍歷法 解構(gòu)賦值法
示例:(前3種畢竟簡(jiǎn)單,這里也不表述)
解構(gòu)賦值法:const a1 = [1, 2]; const a2 = [...a1];或者const [...a2] = a1;

var deepCopy = function(obj) {

if (typeof obj !== "object") return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key];
    }
}
return newObj;
} 


還有一些常用方法如filter() forEach() map() every() some()

詳情請(qǐng)見:最全最細(xì)致的數(shù)組的方法整理 es5+es6

5.對(duì)象的屬性

ES5的屬性特性包括下面六個(gè):
? configurable: 表示能否通過delete來(lái)刪除屬性從而重新定義屬性,能夠修改屬性的特性,默認(rèn)為true
? enumberable: 表示是否能通過for-in循環(huán)返回屬性。默認(rèn)為true
? writable: 是否可以修改屬性, 默認(rèn)為true
? value: 包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值時(shí)3,從這個(gè)屬性讀,寫入屬性時(shí),把新值保存到這個(gè)位置。默認(rèn)值為undefine.
? getter: 在讀取屬性時(shí),調(diào)用的函數(shù)
? setter: 在寫入屬性時(shí)調(diào)用的函數(shù)
? 特別注意:一旦調(diào)用了Object.defineProperty方法之后,那些未定義的特性值除了configurable為false之外,其他都為undefined;

6.DOM

? DOM是針對(duì)HTML和XML文檔的一個(gè)API(應(yīng)用程序編程接口). DOM描繪了一個(gè)層次化的節(jié)點(diǎn)樹, 允許開發(fā)人員添加, 移除和修改頁(yè)面的某一部分.
? 常用的DOM方法:
1)查找
a) getElementById(id) //通過元素Id,唯一性
b) getElementsByTagName() //通過標(biāo)簽名稱
c) getElementsByName() //通過元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng),

  會(huì)得到一個(gè)數(shù)組,其中包括id等于name值的)

2)添加、移除、替換、插入 復(fù)制
c) appendChild(node) // 可添加 可移動(dòng)位置;可添加元素 可添加文本
d) removeChild(node)
e) replaceChild(取代別人的mode,已有節(jié)點(diǎn)) // 替換已有節(jié)點(diǎn)
f) insertBefore(插入節(jié)點(diǎn),已有節(jié)點(diǎn)) //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)
g) cloneNode(true/false) //深淺復(fù)制

3)創(chuàng)建

createDocumentFragment()    //創(chuàng)建一個(gè)DOM片段
 createElement()  //創(chuàng)建一個(gè)具體的元素 div  p  span
 createTextNode()   //創(chuàng)建一個(gè)文本節(jié)點(diǎn)

4)
i) getAttribute()
j) setAttribute()

5 常用的DOM屬性
a) innerHTML 節(jié)點(diǎn)(元素)的文本值
b) parentNode 節(jié)點(diǎn)(元素)的父節(jié)點(diǎn)
c) childNodes
d) attributes 節(jié)點(diǎn)(元素)的屬性節(jié)點(diǎn)

6.兩個(gè)節(jié)點(diǎn)的關(guān)系

7.JS獲取盒模型寬高

為了方便書寫,以下用dom來(lái)表示獲取的HTML的節(jié)點(diǎn)。

dom.style.width/height

  這種方式只能取到dom元素內(nèi)聯(lián)樣式所設(shè)置的寬高,也就是說(shuō)如果該節(jié)點(diǎn)的樣式是在style標(biāo)簽中或外聯(lián)的CSS文件中設(shè)置的話,通過這種方法是獲取不到dom的寬高的。

dom.currentStyle.width/height

  這種方式獲取的是在頁(yè)面渲染完成后的結(jié)果,就是說(shuō)不管是哪種方式設(shè)置的樣式,都能獲取到。
  但這種方式只有IE瀏覽器支持。

window.getComputedStyle(dom).width/height

  這種方式的原理和2是一樣的,這個(gè)可以兼容更多的瀏覽器,通用性好一些。

dom.getBoundingClientRect().width/height

  這種方式是根據(jù)元素在視窗中的絕對(duì)位置來(lái)獲取寬高的

dom.offsetWidth/offsetHeight
這個(gè)就沒什么好說(shuō)的了,最常用的,也是兼容最好的。

8.通用的事件偵聽器

主要考核 事件處理程序 和event對(duì)象及其屬性和方法

var EventUtil = {
        addHandler: function(element,type,handler) {//添加事件處理程序
            if(element.addEventListener) {
                element.addEventListener(type,handler,false)
            } else if(element.attachEvent){
                element.attachEvent("on" + type, handler);
            } else {
                element["on" + type] = handler;
            }
        },
        removeHandler:function(element,type,handler) {//移除事件處理程序
            if(element.removeEventListener) {
                element.removeEventListener(type,handler,false)
            }
        },
        getEvent:function(event){// 獲取事件對(duì)象
            return event ? event : window.event;
        },
        getTarget:function(event){// 獲取事件的目標(biāo)
            return event.target || event.srcElement;
        },
        preventDefault(){
            (event) =>{
                if(event.preventDefault){event.preventDefault()}
                else {event.returnValue= false}
            }
        },
        stopPropagation(){
             (event) =>{
                if(event.stopPropagation){event.stopPropagation()}
                else {event.cancelBubble= true;}
            }
        }
    }
    var list = document.getElementById("list")
    EventUtil.addHandler(list,"click",function(ev){
        event= EventUtil.getEvent(ev);
        var target = EventUtil.getTarget(event);
        alert(target.id);
    })
9.實(shí)現(xiàn)點(diǎn)擊ul中l(wèi)i元素

方法有很多,閉包法、立即執(zhí)行函數(shù)法、、事件委托法;
但本題主要考核 DOM事件流 利用事件委托,減少dom操作,提高性能

var list = document.getElementById("list")
 list.onclick = function(ev){
       var ev = ev || window.event;     
       var target = ev.target || ev.srcElement;
       console.log(target.id);
     }
10.Ajax

原生的寫法

 var xhr = new XMLHttpRequest();
   xhr.onreadystatechange = function(){
       if(xhr.readyState == 4){
           console.log(xhr.status)
            if((xhr.status >= 200 && xhr.status < 300) || xhr.status ==304){
               var hh = xhr.responseText;
               var haha1 = document.getElementById("wokao");
               haha1.innerHTML = hh;
            }else{
                alert("failed11",xhr.status);
            } 
        }
    }
   xhr.open("get","http://10.10.65.109:8888/text.json",true);
   xhr.setRequestHeader("Accept", "application/json"); 
 //  xhr.responseType = "json";
   xhr.send(null);
   

何為異步? 異步與同步的概念
實(shí)現(xiàn)異步的方法:回調(diào) 事件 promise
Ajax最大特性:可以實(shí)現(xiàn)動(dòng)態(tài)不刷新(局部刷新).
優(yōu)點(diǎn):

通過異步模式,提升了用戶體驗(yàn)
優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用
Ajax在客戶端運(yùn)行,承擔(dān)了一部分本來(lái)由服務(wù)器承擔(dān)的工作,減少了大用戶量下的服務(wù)器負(fù)載。

缺點(diǎn)

1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務(wù)器交互的細(xì)節(jié)。
3、對(duì)搜索引擎的支持比較弱。
4、破壞了程序的異常機(jī)制。
5、不容易調(diào)試。

**post 和get的區(qū)別:**

? GET請(qǐng)求會(huì)將參數(shù)跟在URL后進(jìn)行傳遞,而POST請(qǐng)求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給WEB服務(wù)器。當(dāng)然在Ajax請(qǐng)求中,這種區(qū)別對(duì)用戶是不可見的。
? GET方式請(qǐng)求的數(shù)據(jù)會(huì)被瀏覽器緩存起來(lái),因此其他人就可以從瀏覽器的歷史記錄中讀取到這些數(shù)據(jù),例如賬號(hào)和密碼等。在某種情況下,GET方式會(huì)帶來(lái)嚴(yán)重的安全問題。而POST方式相對(duì)來(lái)說(shuō)就可以避免這些問題。
? "GET方式提交的數(shù)據(jù)最多只能是1024字節(jié)",post無(wú)
? get請(qǐng)求和post請(qǐng)求在服務(wù)器端的區(qū)別:在客戶端使用get請(qǐng)求時(shí),服務(wù)器端使用Request.QueryString來(lái)獲取參數(shù),而客戶端使用post請(qǐng)求時(shí),服務(wù)器端使用Request.Form來(lái)獲取參數(shù).

**適用場(chǎng)景:**
POST用于創(chuàng)建資源,資源的內(nèi)容會(huì)被編入HTTP請(qǐng)示的內(nèi)容中。例如,處理訂貨表單、在數(shù)據(jù)庫(kù)中加入新數(shù)據(jù)行等。

當(dāng)請(qǐng)求無(wú)副作用時(shí)(如進(jìn)行搜索),便可使用GET方法;當(dāng)請(qǐng)求有副作用時(shí)(如添加數(shù)據(jù)行),則用POST方法。

若符合下列任一情況,則用POST方法:

請(qǐng)求的結(jié)果有持續(xù)性的副作用,例如,數(shù)據(jù)庫(kù)內(nèi)添加新的數(shù)據(jù)行。

若使用GET方法,則表單上收集的數(shù)據(jù)可能讓URL過長(zhǎng)。

要傳送的數(shù)據(jù)不是采用7位的ASCII編碼。
若符合下列任一情況,則用GET方法:

請(qǐng)求是為了查找資源,HTML表單數(shù)據(jù)僅用來(lái)幫助搜索。

請(qǐng)求結(jié)果無(wú)持續(xù)性的副作用。

收集的數(shù)據(jù)及HTML表單內(nèi)的輸入字段名稱的總長(zhǎng)不超過1024個(gè)字符。

對(duì)cookie localStorage sessionStorage的理解

localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等

**cookie:**

? cookie是網(wǎng)站為了標(biāo)示用戶身份而儲(chǔ)存在用戶本地終端(Client Side)上的數(shù)據(jù)(通常經(jīng)過加密)。
? cookie數(shù)據(jù)始終在同源的http請(qǐng)求中攜帶(即使不需要),記會(huì)在瀏覽器和服務(wù)器間來(lái)回傳遞。
? sessionStorage和localStorage不會(huì)自動(dòng)把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存。
? 存儲(chǔ)大小:
? cookie數(shù)據(jù)大小不能超過4k。
? sessionStorage和localStorage 雖然也有存儲(chǔ)大小的限制,但比cookie大得多,可以達(dá)到5M或更大。
? 有期時(shí)間:
? localStorage 存儲(chǔ)持久數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)不丟失除非主動(dòng)刪除數(shù)據(jù);
? sessionStorage 數(shù)據(jù)在當(dāng)前瀏覽器窗口關(guān)閉后自動(dòng)刪除。
? cookie 設(shè)置的cookie過期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉
? 作用域不同:
? sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁(yè)面;
? localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
? Web Storage 支持事件通知機(jī)制,可以將數(shù)據(jù)更新的通知發(fā)送給監(jiān)聽者。
? Web Storage 的 api 接口使用更方便。
sessionStorage用于本地存儲(chǔ)一個(gè)會(huì)話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁(yè)面才能訪問并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話級(jí)別的存儲(chǔ)。

而localStorage用于持久化的本地存儲(chǔ),除非主動(dòng)刪除數(shù)據(jù),否則數(shù)據(jù)是永遠(yuǎn)不會(huì)過期的。
Web Storage的概念和cookie相似,區(qū)別是它是為了更大容量存儲(chǔ)設(shè)計(jì)的。Cookie的大小是受限的,并且每次你請(qǐng)求一個(gè)新的頁(yè)面的時(shí)候Cookie都會(huì)被發(fā)送過去,這樣無(wú)形中浪費(fèi)了帶寬,另外cookie還需要指定作用域,不可以跨域調(diào)用。

除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發(fā)者自己封裝setCookie,getCookie。
總之:cookie的作用是與服務(wù)器進(jìn)行交互,作為HTTP規(guī)范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲(chǔ)”數(shù)據(jù)而生
cookie優(yōu)點(diǎn):極高的擴(kuò)展性和可用性 缺點(diǎn): 數(shù)量和長(zhǎng)度受限、安全問題
cookie 和session 的區(qū)別:
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙

考慮到安全應(yīng)當(dāng)使用session。

3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會(huì)比較占用你服務(wù)器的性能

 考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。

4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
5、所以個(gè)人建議:

將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
12.IE的不同之處

IE支持currentStyle,F(xiàn)Irefox使用getComputStyle

IE 使用innerText,F(xiàn)irefox使用textContent

濾鏡方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num

事件方面:IE:attachEvent:火狐是addEventListener

鼠標(biāo)位置:IE是event.clientX;火狐是event.pageX

IE使用event.srcElement;Firefox使用event.target

IE中消除list的原點(diǎn)僅需margin:0即可達(dá)到最終效果;FIrefox需要設(shè)置margin:0;padding:0以及l(fā)ist-style:none

CSS圓角:ie7以下不支持圓角

13.this工作原理

原則,那就是this指的是調(diào)用函數(shù)的那個(gè)對(duì)象。

javascript 的this主要是看如何調(diào)用這個(gè)函數(shù),而不是這個(gè)函數(shù)所在的作用域。obj.fn() fn中的 this 就是 obj。 fn() this是undifine, 而在js進(jìn)入函數(shù)之前,會(huì)有 if(!this) { this = window} 這樣的操作。

this 一共有六種不同的值:

普通函數(shù)調(diào)用,this為全局對(duì)象或是undefined

作為對(duì)象的方法,this為那個(gè)對(duì)象

new 表達(dá)式,this為以該函數(shù)為原型的新創(chuàng)建的對(duì)象

使用 apply/call指定 this

用bind綁定固定的this

事件處理函數(shù)中的this是當(dāng)前的觸發(fā)事件的DOM元素(event.currentTarget)
IE attachEvent添加的事件處理函數(shù)中this為window




    
    this


在嚴(yán)格模式下,一般的函數(shù)調(diào)用中 this 的值是 undefined。

測(cè)試DOM元素(event.currentTarget)

測(cè)試DOM元素IE

14.函數(shù)

1.函數(shù)的調(diào)用方式

方法調(diào)用模型 var obj = { func : function(){};} obj.func()

函數(shù)調(diào)用模式  var aa = function(){} aa();

構(gòu)造器調(diào)用模式

apply/ call調(diào)用模式

立即執(zhí)行函數(shù)(function(){}())

區(qū)別:函數(shù)調(diào)用模式,有函數(shù)提升的;即aa() 無(wú)需必須在var aa = function(){} 后面

2.return的含義

注:return不一定非得用在function 中,也可以直接放在html中,如:onsubmit="return false";

語(yǔ)法:return 表達(dá)式;
含義:語(yǔ)句結(jié)束函數(shù)執(zhí)行,返回調(diào)用函數(shù),而且把表達(dá)式的值作為函數(shù)的結(jié)果
通常函數(shù)經(jīng)過一系列的處理后需要給外部返回一個(gè)值,這個(gè)值一般用return返回出去,也可以是說(shuō)return是向函數(shù)返回返回值,并終止函數(shù)的運(yùn)行.

return;

含義:即 return null 無(wú)函數(shù)返回值;
能中斷方法的執(zhí)行,但無(wú)法阻止事件的默認(rèn)行為。
把控制權(quán)返回給頁(yè)面。

return false;

    含義:相當(dāng)于終止符;
    1. 一般是用來(lái)取消默認(rèn)動(dòng)作的。比如,終止表單提交。比如你單擊一個(gè)鏈接除了觸發(fā)你的onclick事件外
    還會(huì)觸發(fā)一個(gè)默認(rèn)事件就是執(zhí)行頁(yè)面的跳轉(zhuǎn)。
    所以如果你想取消對(duì)象的默認(rèn)動(dòng)作(event.preventDefault();)就可以return false。
    2. return false 只在當(dāng)前函數(shù)有效,不會(huì)影響其他外部函數(shù)的執(zhí)行
    

retrun true;

    含義:相當(dāng)于執(zhí)行符。執(zhí)行終止默認(rèn)的事件行為
     返回正確的處理結(jié)果。


15.閉包

? 閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù). 創(chuàng)建閉包常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù).
作用:
1.匿名自執(zhí)行函數(shù) (function (){ ... })(); 創(chuàng)建了一個(gè)匿名的函數(shù),并立即執(zhí)行它,由于外部無(wú)法引用它內(nèi)部的變量,因此在執(zhí)行完后很快就會(huì)被釋放,關(guān)鍵是這種機(jī)制不會(huì)污染全局對(duì)象。
2.緩存, 可保留函數(shù)內(nèi)部的值
3.實(shí)現(xiàn)封裝
4.實(shí)現(xiàn)模板
5.給了js函數(shù)生成函數(shù)的能力,增加了js代碼的抽象能力
缺點(diǎn)
1.造成內(nèi)存泄露;變量?jī)?nèi)存無(wú)法被標(biāo)記,導(dǎo)致內(nèi)存不會(huì)被垃圾回收機(jī)制回收。
為什么要用
局部變量無(wú)法共享和長(zhǎng)久的保存,而全局變量可能造成變量污染,所以我們希望有一種機(jī)制既可以長(zhǎng)久的保存變量又不會(huì)造成全局污染。
如何使用
1.定義外層函數(shù),封裝被保護(hù)的局部變量。
2.定義內(nèi)層函數(shù),執(zhí)行對(duì)外部函數(shù)變量的操作。
3.外層函數(shù)返回內(nèi)層函數(shù)的對(duì)象,并且外層函數(shù)被調(diào)用,結(jié)果保存在一個(gè)全局的變量中。

var getNum;
function getCounter() { 
    var n = 1; 
    var inner = function () { return n++; }
    return inner;
}

getNum = getCounter();
console.log(getNum()); //1   2 3 4
16.call aplly bind

apply 、 call 、bind 三者都是用來(lái)改變函數(shù)的this對(duì)象的指向的;
apply 、 call 、bind 三者第一個(gè)參數(shù)都是this要指向的對(duì)象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后續(xù)參數(shù)傳參;
bind是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;
apply 、call 則是立即調(diào)用 。

function fn(a,b){
    console.log(this);
    console.log(a);
    console.log(b);
}
// bind(this,args...)
bf = fn.bind("Bind this",10); // 沒有任何輸出,也就是說(shuō)沒有執(zhí)行這個(gè)函數(shù)
bf(); // "Bind this",10,undefined
bf(20);// “Bind this”,10,20
// 原函數(shù)不受影響
fn(1,2); //window, 1,2
bf2 = fn.bind("Bind this",1,2);
bf2(); // "Bind this",1,2

// call(this,args...)
fn.call("Call this",1) // "Call this",1,undefined
fn.call("Call this",1,2) // "Call this",1,2

// apply(this,[args])
fn.apply("Apply this",[1]) // "Apply this",1,undefined
fn.apply("Apply this",[1,2]) // "Apply this",1,2
17.js語(yǔ)言特性

特性,即封裝、繼承、多態(tài)
此處內(nèi)容較多,便不詳細(xì)敘述。注意一下繼承的方式
繼承6方式:
  1、拷貝繼承:通用型 有new無(wú)new都可以用
  2、類式繼承:new構(gòu)造函數(shù)---利用構(gòu)造函數(shù)(類)繼承的方式
  3、原型繼承:無(wú)new的對(duì)象---借助原型來(lái)實(shí)現(xiàn)對(duì)象繼承對(duì)象
  4. 屬性繼承:調(diào)用父類的構(gòu)造函數(shù)call
  5. 方法繼承:用for in的形式 拷貝繼承(jq也用拷貝繼承)

18."use strict"

嚴(yán)格模式”的目的,主要有以下幾個(gè):

消除Javascript語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;

  - 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;
  - 提高編譯器效率,增加運(yùn)行速度;
  - 為未來(lái)新版本的Javascript做好鋪墊。
“嚴(yán)格模式”體現(xiàn)了Javascript更合理、更安全、更嚴(yán)謹(jǐn)?shù)陌l(fā)展方向

19.加載方式

1.延遲加載有些 js 代碼并不是頁(yè)面初始化的時(shí)候就立刻需要的,而稍后的某些情況才需要的。延遲加載就是一開始并不加載這些暫時(shí)不用的js,而是在需要的時(shí)候或稍后再通過js 的控制來(lái)異步加載。
JS延遲加載有助于提高頁(yè)面加載速度。

js的進(jìn)程由解析和執(zhí)行構(gòu)成。所有的延遲加載方式都只是延遲了執(zhí)行過程。解析從未停止
js的執(zhí)行順序是自上而下。
延遲加載幾種方式:

defer 屬性 defer的作用是,告訴瀏覽器,等到DOM加載完成后,再執(zhí)行指定腳本。
async 屬性 async的作用是,使用另一個(gè)進(jìn)程下載腳本,下載時(shí)不會(huì)阻塞渲染,下載好了 就執(zhí)行。
動(dòng)態(tài)創(chuàng)建DOM方式  document.createElement 
使用jQuery的getScript方法
使用setTimeout延遲方法
讓JS最后加載(放在文檔尾部)

2.同步加載,又稱阻塞模式,會(huì)阻止瀏覽器的后續(xù)處理,停止了后續(xù)的解析,因此停止了后續(xù)的文件加載(如圖像)、渲染、代碼執(zhí)行。

3.異步加載:也就是說(shuō)第一個(gè)fun請(qǐng)求數(shù)據(jù)時(shí),數(shù)據(jù)還未返回時(shí)便開始執(zhí)行第二個(gè)fun了
代表:ajax 回調(diào) 事件 promise

4.預(yù)加載
一種瀏覽器機(jī)制,使用瀏覽器空閑時(shí)間來(lái)預(yù)先下載/加載用戶接下來(lái)很可能會(huì)瀏覽的頁(yè)面/資源,當(dāng)用戶訪問某個(gè)預(yù)加載的鏈接時(shí),如果從緩存命中,頁(yè)面就得以快速呈現(xiàn)
5.圖片延遲加載的方式

js--進(jìn)階 1.原型鏈

許多OO語(yǔ)言支持兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。
接口繼承只繼承方法簽名,實(shí)現(xiàn)繼承則繼承實(shí)際的方法。
由于函數(shù)無(wú)簽名,在JavaScript中無(wú)法實(shí)現(xiàn)接口繼承。所以只能實(shí)現(xiàn)方法繼承。
實(shí)現(xiàn)繼承主要依賴原型鏈。
基本思想:利用原型,讓那個(gè)一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。A.prototype= new B();讓原型對(duì)象等于另一個(gè)類型的實(shí)例。
所有函數(shù)的默認(rèn)原型都是Object的實(shí)例
即A繼承了B ;B 繼承了Object;

什么是原型對(duì)象。我們知道每個(gè)構(gòu)造函數(shù)一旦創(chuàng)建都有prototype指針指向它的原型對(duì)象(構(gòu)造函數(shù).prototype)。而原型對(duì)象(構(gòu)造函數(shù).prototype)會(huì)默認(rèn)生成一個(gè)constructor指針又指向構(gòu)造函數(shù)。在創(chuàng)建實(shí)例時(shí),每個(gè)實(shí)例有一個(gè)__proto__指向該原型對(duì)象。原型對(duì)象內(nèi)創(chuàng)建的所有方法會(huì)被所有實(shí)例共享。
例:

 Function.prototype = {    
        constructor : Function,
        __proto__ : parent prototype,
        some prototype properties: ...
    };

原型對(duì)象中的方法屬性是被所有實(shí)例共享的。如果含有引用類型的屬性,如數(shù)組,修改person1中的數(shù)組屬性,也會(huì)導(dǎo)致person2中的該屬性發(fā)生變化。

什么是原型鏈?
函數(shù)的原型對(duì)象constructor默認(rèn)指向函數(shù)本身,原型對(duì)象除了有原型屬性外,為了實(shí)現(xiàn)繼承,還有一個(gè)原型鏈指針proto,該指針指向上一層的原型對(duì)象,而上一層的原型對(duì)象的結(jié)構(gòu)依然類似,這樣利用proto一直指向Object的原型對(duì)象上,而Object的原型對(duì)象用Object.prototype.proto = null表示原型鏈的最頂端,如此變形成了javascript的原型鏈繼承,同時(shí)也解釋了為什么所有的javascript對(duì)象都具有Object的基本方法。

原型鏈就是創(chuàng)建一個(gè)構(gòu)造函數(shù),它會(huì)默認(rèn)生成一個(gè)prototype屬性并指向原型對(duì)象。使用下一個(gè)構(gòu)造函數(shù)的原型對(duì)象作為這個(gè)構(gòu)造函數(shù)的實(shí)例。即 A.prototype = new B(); 在下下一個(gè)構(gòu)造函數(shù)的原型對(duì)象 = new nextFuction。這樣下去就會(huì)構(gòu)成一條實(shí)例與原型之間的鏈條,這就是原型鏈。

2.繼承

構(gòu)造函數(shù)A()和實(shí)例a1 a2之間的關(guān)系;var a1 = new A(); var a2 = new A();
實(shí)例a1與實(shí)例a2是獨(dú)立的
實(shí)例和原型的關(guān)系 a1.__proto__ = A.prototype
構(gòu)造函數(shù)A()和其原型的關(guān)系 A.prototype.constructor=A

6種繼承方式
原型鏈繼承本質(zhì):
是子用類型B的原型等于超類型的實(shí)例,
B.prototype= new A()

構(gòu)造函數(shù)繼承本質(zhì):
是子用類型的構(gòu)造函數(shù)內(nèi)部調(diào)用A(),
B(){A.call(this,**);}

組合繼承本質(zhì)
原型鏈和構(gòu)造函數(shù)的組合,原型繼承方法,構(gòu)造函數(shù)繼承屬性

原型式繼承本質(zhì):基于已有對(duì)象創(chuàng)建一個(gè)對(duì)象,
即對(duì)象A的淺拷貝,
var b= Object.create(A)

寄生式繼承本質(zhì):
創(chuàng)建一個(gè)用于封裝繼承過程的函數(shù),
function b(A){var clone = Object.create(A) ;clone.=;return clone;}

寄生組合繼承本質(zhì):
寄生式繼承超類型A的原型,并將結(jié)果賦值給子類型的原型;
或?qū)?duì)象A的原型淺拷貝,
function B(**){

A.call(this,**)

}
function c(A,B){var clone = Object.create(A.prototype); clone.constructor = B;B.prototype=clone;) ;}

 function Person(name) {
            this.name = ["123","456","789",name];
        }
        Person.prototype.go = function(){
            return console.log(this.name)
        }
        Person.prototype.sex = ["男","女"];
        var ren = new Person();
        console.log("構(gòu)造函數(shù)和原型的關(guān)系:",Person.prototype.constructor ===Person)
        console.log("實(shí)例和原型的關(guān)系",ren.__proto__ ===Person.prototype)
        
        // 原型鏈繼承 
        // 缺點(diǎn)1.不能向person中傳遞參數(shù);
        // 缺點(diǎn)2.超類型的原型屬性會(huì)被其他實(shí)例共享,一個(gè)實(shí)例改變,則其他實(shí)例也改變。
        // 下面2個(gè)原型的順序不能換  
        function Shuagnfeng(love) {
            this.love = ["fd","fddfdf"]; 
        }
        Shuagnfeng.prototype = new Person();
        console.log("會(huì)誤會(huì)超類型Person:",Shuagnfeng.prototype.constructor ===Person) //true
        console.log("構(gòu)成原型鏈,",Shuagnfeng.prototype.__proto__ ===Person.prototype) //true
        Shuagnfeng.prototype.constructor ===Shuagnfeng;
        Shuagnfeng.prototype.goWork = function(){
           return  console.log("原型鏈繼承的方法");
        }
        var child = new Person();
Shuagnfeng.prototype.name.push(121);
console.log("超類型實(shí)例2 child",child.name);

        var xiaozhang = new Shuagnfeng("dff");
        var xiaozhang1 = new Shuagnfeng("zzz");
        xiaozhang.go();
        xiaozhang.goWork();   
        xiaozhang.name.push("只對(duì)xiaozhang增加屬于超類型Person中array值",22);
        xiaozhang.love.push("只對(duì)xiaozhang增加屬于構(gòu)造函數(shù)中array值",22);
        xiaozhang.sex.push("只對(duì)xiaozhang增加屬于超類型的原型中array值");

        console.log("xiaozhang.超類型Person中name",xiaozhang.name);
        console.log("xiaozhang1.超類型Person中name",xiaozhang1.name);
        console.log("xiaozhang.構(gòu)造函數(shù)中中l(wèi)ove",xiaozhang.love);
        console.log("xiaozhang1.構(gòu)造函數(shù)中l(wèi)ove",xiaozhang1.love);
        console.log("xiaozhang.超類型的原型中sex",xiaozhang.sex);
        console.log("xiaozhang1.超類型的原型中sex",xiaozhang1.sex);


// 構(gòu)造函數(shù)的繼承
// 優(yōu)點(diǎn),不會(huì)改變引用類型的屬性,能傳遞參數(shù)
// 缺點(diǎn)無(wú)法復(fù)用方法;
        function Jianbo() {
            Person.call(this,"構(gòu)造函數(shù)的繼承")
        }
        var xiaonie = new Jianbo();
        console.log("構(gòu)造函數(shù)的繼承xiaonie.name可傳參數(shù)",xiaonie.name);
       // xiaonie.go(); // 不存在



// 組合繼承
// 原型鏈繼承方法、構(gòu)造函數(shù)繼承屬性
        function Nb(love) {
            Person.call(this,"nb")
            this.love = love
        }
        Nb.prototype = new Person("12");
        console.log("12",Nb.prototype.constructor ===Person) // true 
        console.log("13",Nb.prototype.constructor ===Nb)// false 因?yàn)橹貙懺?,?huì)使原型失去了constructor屬性
        Nb.prototype.constructor =Nb
         console.log("14",Nb.prototype.constructor ===Person) // false
        Nb.prototype.say = function(){
            console.log("say","say")
        }
        var nb= new Nb();
        var nb1= new Nb("組合繼承");
        nb.name.push("xiaoniubi");
        console.log("nb.name",nb.name);
        console.log("nb1.name",nb1.name);
        console.log("nb1.love",nb1.love);
        nb.go();
        nb.say();

// 原型式繼承Object.create()  將基礎(chǔ)對(duì)象傳給object()函數(shù) 
// 本質(zhì)是淺復(fù)制  副本的引用類型會(huì)被改變
// 缺點(diǎn):引用類型的屬性會(huì)被共享  和原型鏈繼承差不多
// 使用場(chǎng)景: 讓一個(gè)對(duì)象與另一個(gè)對(duì)象的保持類似
function object(o){
    function F(){}
    F.prototype= o;
    return new F();
}
var animal = {
    name:"原型式繼承默認(rèn)值",
    friends:[1,2,3,4]
}
var haha= object(animal);
var gaga = Object.create(animal);
var haha1= object(animal);
console.log("haha",haha.name);
console.log("gaga",gaga.name);
haha.name="原型式繼承name值變了";
haha.friends.push("原型式繼承array值變了");
console.log("haha",haha.name);
console.log("haha1",haha1.name);
console.log("haha",haha.friends);
console.log("haha1",haha1.friends);

// 寄生式繼承
// 能繼承方法,但方法不能復(fù)用
function createAnother(original){
 var clone =  object(original);
 clone.say = function(){
    console.log("寄生式繼承方法")
 }
  return clone;
}

var hh = createAnother(animal);
hh.name="寄生式繼承"
console.log("hh",hh.name);
hh.say()       

// 寄生組合式
// 所有方式中最有效的方式 只調(diào)用繼承的構(gòu)造函數(shù)一次




// 判斷實(shí)例和原型的關(guān)系  使用instanceof 和 isPrototypeOf()
        console.log("實(shí)例和原型的關(guān)系",xiaozhang instanceof Shuagnfeng);
        console.log("實(shí)例和原型的關(guān)系",xiaozhang instanceof Person);
        console.log("實(shí)例和原型的關(guān)系",xiaozhang instanceof Object);
        console.log("實(shí)例和原型的關(guān)系",Object.prototype.isPrototypeOf(xiaozhang));
        console.log(xiaozhang.__proto__); 
3.事件委托

事件處理程序 獲取事件對(duì)象 事件目標(biāo)
好處 減少DOM 操作 ,減少性能

4.跨域

造成跨域的原因
瀏覽器的同源策略,即XMLHttpRequest(XHR)對(duì)象只能訪問同一域中的資源
這是種防止惡意行為的安全策略。
第二個(gè):瀏覽器中不同域的框架之間是不能進(jìn)行js的交互操作的。

何謂同源:URL由協(xié)議、域名、端口和路徑組成,如果兩個(gè)URL的協(xié)議、域名和端口相同,則表示它們同源。

在瀏覽器中,

6 JS引擎

瀏覽器內(nèi)核又可以分成兩部分:
渲染引擎(layout engineer或者RenderingEngine)和JS引擎。
JS的引擎深入分析鏈接描述
10分鐘理解JS引擎的執(zhí)行機(jī)制
http://www.ruanyifeng.com/blo...
JS引擎負(fù)責(zé)對(duì)JavaScript進(jìn)行解釋、編譯和執(zhí)行,以使網(wǎng)頁(yè)達(dá)到一些動(dòng)態(tài)的效果。

js的幾種引入方式
js引擎是單線程 異步的
--- 任務(wù)隊(duì)列 事件 和回調(diào)函數(shù) Event Loop
是通過的事件循環(huán)(event loop),實(shí)現(xiàn)單線程和異步的。
單線程:同一時(shí)刻只能執(zhí)行一個(gè)代碼塊
將要執(zhí)行的代碼放在任務(wù)隊(duì)列中,但js引擎執(zhí)行代碼塊結(jié)束,事件循環(huán)會(huì)執(zhí)行任務(wù)隊(duì)列中的下一個(gè)任務(wù)。
Event Loop 負(fù)責(zé)監(jiān)控代碼執(zhí)行和管理任務(wù)隊(duì)列。
異步的,即可通過事件 回調(diào)等方式,向任務(wù)隊(duì)列中添加新任務(wù)。

JS的執(zhí)行機(jī)制是

首先判斷JS是同步還是異步,同步就進(jìn)入主進(jìn)程,異步就進(jìn)入event table
異步任務(wù)在event table中注冊(cè)函數(shù),當(dāng)滿足觸發(fā)條件后,被推入event queue
同步任務(wù)進(jìn)入主線程后一直執(zhí)行,直到主線程空閑時(shí),才會(huì)去event queue中查看是否有可執(zhí)行的異步任務(wù),如果有就推入主進(jìn)程中
以上三步循環(huán)執(zhí)行,這就是event loop

準(zhǔn)確的劃分方式是:
macro-task(宏任務(wù)):包括整體代碼script,setTimeout,setInterval
micro-task(微任務(wù)):Promise,process.nextTick
按照這種分類方式:JS的執(zhí)行機(jī)制是

執(zhí)行一個(gè)宏任務(wù),過程中如果遇到微任務(wù),就將其放到微任務(wù)的【事件隊(duì)列】里
當(dāng)前宏任務(wù)執(zhí)行完成后,會(huì)查看微任務(wù)的【事件隊(duì)列】,并將里面全部的微任務(wù)依次執(zhí)行完
重復(fù)以上2步驟,結(jié)合event loop(1) event loop(2) ,就是更為準(zhǔn)確的JS執(zhí)行機(jī)制了。

7 錯(cuò)誤監(jiān)控
前端錯(cuò)誤的分類

運(yùn)行時(shí)錯(cuò)誤(代碼錯(cuò)誤)

資源加載錯(cuò)誤

接口錯(cuò)誤

錯(cuò)誤的捕獲方式

運(yùn)行時(shí)錯(cuò)誤的捕獲方式:

try...catch
window.onerror 含有詳細(xì)的error信息  
    window.onerror = function(msg, url, lineNo, columnNo, error){}
window.addEventListener("error")
     window.addEventListener("error", event =>  
        { console.log("addEventListener error:" + event.target); 
        }, true); 
   

資源加載錯(cuò)誤:

object.onerror(如img,script)
performance.getEntries()
Error事件捕獲

接口錯(cuò)誤:

    所有http請(qǐng)求都是基于xmlHttpRequest或者fetch封裝的。
    所以要捕獲全局的接口錯(cuò)誤,方法就是封裝xmlHttpRequest或者fetch

結(jié)論
1.使用window.onerror捕獲JS運(yùn)行時(shí)錯(cuò)誤
2.使用window.addEventListener(‘unhandledrejection’)捕獲未處理的promise reject錯(cuò)誤
3.重寫console.error捕獲console.error錯(cuò)誤
4.在跨域腳本上配置crossorigin="anonymous"捕獲跨域腳本錯(cuò)誤
window.addEventListener(‘error’)捕獲資源加載錯(cuò)誤。因?yàn)樗材懿东@js運(yùn)行時(shí)錯(cuò)誤,為避免重復(fù)上報(bào)js運(yùn)行時(shí)錯(cuò)誤,此時(shí)只有event.srcElement inatanceof HTMLScriptElement或HTMLLinkElement或HTMLImageElement時(shí)才上報(bào)
5.重寫window.XMLHttpRequest和window.fetch捕獲請(qǐng)求錯(cuò)誤

延伸:跨域的js運(yùn)行錯(cuò)誤可以捕獲嗎,錯(cuò)誤提示什么,應(yīng)該怎么處理?

可以。
Script error
1.在script標(biāo)簽增加crossorigin屬性
2.設(shè)置js資源響應(yīng)頭Access-Control-Allow-Orgin:*

上報(bào)錯(cuò)誤的基本原理

1. 采用Ajax通信方式上報(bào)
2. 利用Image對(duì)象上報(bào)

更多

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94717.html

相關(guān)文章

  • JavaScript面向?qū)ο?em>核心知識(shí)歸納

    摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤?duì)象。因此在構(gòu)造函數(shù)中表示剛剛創(chuàng)建出來(lái)的對(duì)象。在構(gòu)造函數(shù)中利用對(duì)象的動(dòng)態(tài)特性為其對(duì)象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤?duì)象。面向?qū)ο箝_發(fā)就是使用對(duì)象開發(fā)。 面向過程就是用過程的方式進(jìn)行開發(fā)。面向?qū)ο笫菍?duì)面向過程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個(gè)對(duì)象描述數(shù)據(jù),需要抽取這個(gè)對(duì)象的核心數(shù)據(jù) 提出需要的核心...

    TalkingData 評(píng)論0 收藏0
  • 工程師如何提升自身的軟素質(zhì)

    摘要:既然軟素質(zhì)如此有用,那么如何提升就成了最主要的問題。如何提升軟素質(zhì)所有沒有給出切實(shí)可行建議的文章都是雞湯文。自己心中要有努力提升自己軟素質(zhì)的認(rèn)知和欲望,才能做到不斷的進(jìn)步??偨Y(jié)專業(yè)知識(shí)固然重要,但是軟素質(zhì)才是提升自身生活質(zhì)量的關(guān)鍵。 前言 其實(shí)我現(xiàn)在寫這篇文章有點(diǎn)早了,因?yàn)槲易约簩?duì)如何提高軟素質(zhì)也只有一點(diǎn)粗淺的想法。但是我最近發(fā)現(xiàn),真正能讓別人接受的不一定是總結(jié)的極好的真知灼見。真知灼...

    plokmju88 評(píng)論0 收藏0
  • 工程師如何提升自身的軟素質(zhì)

    摘要:既然軟素質(zhì)如此有用,那么如何提升就成了最主要的問題。如何提升軟素質(zhì)所有沒有給出切實(shí)可行建議的文章都是雞湯文。自己心中要有努力提升自己軟素質(zhì)的認(rèn)知和欲望,才能做到不斷的進(jìn)步??偨Y(jié)專業(yè)知識(shí)固然重要,但是軟素質(zhì)才是提升自身生活質(zhì)量的關(guān)鍵。 前言 其實(shí)我現(xiàn)在寫這篇文章有點(diǎn)早了,因?yàn)槲易约簩?duì)如何提高軟素質(zhì)也只有一點(diǎn)粗淺的想法。但是我最近發(fā)現(xiàn),真正能讓別人接受的不一定是總結(jié)的極好的真知灼見。真知灼...

    khs1994 評(píng)論0 收藏0
  • 【精品】12條核心知識(shí)帶你了解機(jī)器學(xué)習(xí)

    摘要:機(jī)器學(xué)習(xí)初學(xué)者中最常見的錯(cuò)誤就是對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行測(cè)試并自以為大獲成功。綜上來(lái)看,機(jī)器學(xué)習(xí)需要知識(shí)這點(diǎn)并不奇怪。機(jī)器學(xué)習(xí)更像是種田,讓大自然完成大部分的工作。這個(gè)問題被稱為過擬合,是機(jī)器學(xué)習(xí)中的難題。 機(jī)器學(xué)習(xí)算法可以通過學(xué)習(xí)就可以弄清楚如何去執(zhí)行一些重要的任務(wù)。在手動(dòng)編程不可行的情況下,這種方法通常既可行又經(jīng)濟(jì)有效。隨著可獲取的數(shù)據(jù)在逐步增多,越來(lái)越多更加復(fù)雜的問題可以用機(jī)器學(xué)習(xí)來(lái)解決。...

    AndroidTraveler 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<