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属性

                      3.如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充。

   最典型的类数组是arguments,实参列表。当我们手动创建一个类数组如下:

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

 

  

  当加上length的时候,形式上就会变成数组,但是这时候,数组的方法还不能够使用,当我们手动添加一个数组方法,他就具有数组的特性,这种东西就叫类数组,可以当做数组来操

作,然后,当我们加上splice这个属性的时候,它就会形式上也会变成数组的展现形式了。但是实际上也还是对象。

  我们如果要使用类数组就得特别注意length,因为系统是根据length操作类数组。

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

 

  看看最后obj是什么?

            

         可以发现当我们设置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.拒绝重复的参数和属性。

 

posted @ 2017-12-03 20:30  暮雨橙风  阅读(172)  评论(0编辑  收藏  举报