JavaScript初階(八)---------- 類數組、錯誤類型、ES5嚴格模式

類數組

      類數組本質上是對象,它的原型指向的是Object,而數字的原型指向的是Array。之因此叫它類數組是由於他長得確實像數組,不具有數組的一些方法,準確的來講它叫對象數組。數組

        

function test(){
    arguments.push(1);
}
test(1,2,3,4,5,6)
//報錯:arguments.push is not a function ;

 

 

          它有三大特色:函數

                            1.能夠利用屬性名模擬數組的特性性能

                      2.能夠動態的增加length屬性 this

                      3.若是強行讓類數組調用push方法,則會根據length屬性值的位置進行屬性的擴充。spa

   最典型的類數組是arguments,實參列表。當咱們手動建立一個類數組以下:prototype

var obj = {
    "0" : "a",
    "1" : "b",
    "2" : "c",
    "length" : 4,
    "push" : Array.prototype.push    
    "splice" : Array.prototype.push    
}

 

  

  當加上length的時候,形式上就會變成數組,可是這時候,數組的方法還不可以使用,當咱們手動添加一個數組方法,他就具備數組的特性,這種東西就叫類數組,能夠當作數組來操線程

做,而後,當咱們加上splice這個屬性的時候,它就會形式上也會變成數組的展示形式了。可是實際上也仍是對象。code

  咱們若是要使用類數組就得特別注意length,由於系統是根據length操做類數組。對象

var obj = {
                "0" : "a",
                "1" : "b",
                "2" : "c",
                "length" : 4,
                "push" : Array.prototype.push,    
                "splice" : Array.prototype.push    
            }
            obj.push("e");

 

  看看最後obj是什麼?blog

            

         能夠發現當咱們設置length爲4的時候,再往類數組裏面添加東西,length也會變化,而且空位用empty補上

   當咱們把length變成2,obj會變成什麼樣,咱們再來看看

            

              此時length變爲3,類數組第三位被取代。

  類數組的優勢是既能當數組用,又能當對象用,操做範圍廣。

 

          將類數組轉換爲數組能夠添加一個方法slice( ),在對象obj里加上

slice : Array.prototype.slice 

 

 

 

           

         而後經過obj.slice( )轉變爲數組。

    這裏順便簡單說一下splice( )與slice( )的區別

    slice( )     

      slice( ) 方法可提取字符串的某個部分,並以新的字符串返回被提取的部分。不會影響原數組

     splice( )

      splice() 方法向/從數組中添加/刪除項目,而後返回被刪除的項目。會改變原數組。

 

 


 

 錯誤類型

     Error.name的六種值對應的信息: 1.EvalError  ------>        eval() 的使用與定義不一致

                   2.RangeError --------->    數值越界

                   3.ReferenceError ---------->   非法或不能識別的引用數值

                     4.SyntaxError ------------>  語法解析錯誤

                   5.TypeError ----------->  操做類型錯誤

                   6.URLError -----------> URL處理函數使用不當

 

   try.....catch 

      因爲js是單線程,當遇到邏輯錯誤的時候就會阻塞後面的程序運行,有時候咱們須要及時報錯,也能繼續往下執行,不發生阻塞,這時候就要用到try....catch了

try{
    console.log(123);
    console.log(a);//不報錯 跳到catch。若是沒錯,就直接跳過catch
    console.log(234);
}catch(e){//捉住報錯信息。
    console.log(e)
}

 

 

 

   咱們來看看結果

            

        報錯信息被捕捉到送給catch而且被打印出來。

   try  catch對於一些低級錯誤(例如:語法錯誤)不能捉住。當報錯的時候,系統會把錯誤信息做爲一個實參,傳到catch裏面,這個實參有兩個屬性,分別是name,和message,錯誤

的名稱,和錯誤的信息。可是實際開發中,可見性的錯誤都要利用兼容解決。

 

 


ES5嚴格模式

   ES5是ES3的升級版,如今快到ES8了。如今講的東西都是ES3的,每次升級,都是在原有的基礎上進行功能的增刪改,因此有時候會產生兼容性的問題,產生衝突。當產生衝突時,

默認的是優先使用ES3的。可是咱們須要使用ES5的功能時,咱們須要使用嚴格模式。在邏輯的最前寫」use strict」,就會進入ES5嚴格模式。爲何要使用」use strict」的形式呢?由於這

寫法兼容性是最好的,在ES3引擎也能解析。

function exp(){
    "use strict";
    //code
}

 

兩種用法  1.全局嚴格模式    2.局部函數內嚴格模式

  在嚴格模式下,不支持with , arguments.callee , func.caller,變量賦值前必須聲明,局部this必須被賦值(Person.call(null/undefined) 賦值什麼就是什麼),拒絕重複屬性和參數。

 

 

1.with語句,能夠改變做用域鏈,直接看到最頂端,提供一個執行上下文。很浪費效率,很浪費性能。若是指向的頂層做用域,沒有須要的變量,又會在本身的做用域進行查找。固然,with

能夠與命名空間進行聯合使用

var obj = {
    a : "ooo"
    
}
var a = "global";
function test(){
    var a = "test";
    with(obj){
        console.log(a);//ooo 這個時候,with直接到了obj中取索要a變量。
    }
}
test();

 

 

2.不能使用未聲明的變量,this也必須說明是什麼指向。

 

3.拒絕重複的參數和屬性。

相關文章
相關標籤/搜索