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.拒绝重复的参数和属性。

相关文章
相关标签/搜索