美文网首页前端技术栈
es5数组及对象处理方法

es5数组及对象处理方法

作者: Veb | 来源:发表于2018-01-29 17:16 被阅读208次

    es6已经出来了,为什么还要整理es5?因为知识不是跳跃的,就像已经出来vue、react这样的框架,你还是需要jQuery一样!

    es5浏览器兼容:

    • Opera 11+
    • Firefox 3.6+
    • Safari 5+
    • Chrome 8+
    • Internet Explorer 9+

    vue因为采用es5语法,所以兼容也是兼容到IE9;这就说明,在你开发的时候可以放肆的运用css3了!接下来主要介绍常用数组及对象新增处理方法。

    数组

    1.forEach

    forEach是Array新方法中最基本的一个,就是遍历,循环。如下:

    //之前
    var arr=[1,2,3,4,5];
    for(var i=0;i<arr.length;i++){
          console.log(i)//1 2 3 4 5
    }
    //forEach
    arr.forEach(function(value,index,array){
          console.log(value)//1 2 3 4 5
    })
    
    //甚至
    var obj={
          say:function(a){
                alert(a);
          }
    }
    arr.forEach(function(value,index,array){
          this.say(value)//1 2 3 4 5
    },obj)
    //改变this指向,在特定环境下非常方便!以下介绍的数组方法同样适用
    

    再强调一下:改变this指向,在特定环境下非常方便!以下介绍的数组方法同样适用

    2.map

    调用数组的每个元素传递给指定的函数,并返回一个包含返回值的新数组;传递给map()的函数有返回值,map()返回新数组,不会修改调用的数组;

    var arr=[1,2,3,4,5];
    var arr2=arr.map(function(x){
              return x*x
    })
    //arr2=[1, 4, 9, 16, 25]
    
    3.filter

    返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加;

    var arr=[1,2,3,4,5];
    var arr2=arr.filter(function(x){
               if(x>3){
                      return true;
               }
    })
    //arr2=[4, 5]
    
    4.every

    every是“所有”函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false;

    var arr=[1,2,3,4,5];
    var flag=arr.every(function(x){
               return x>3
    })
    //false
    
    5.some

    some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false;

    var arr=[1,2,3,4,5];
    var flag=arr.some(function(x){
               return x>3
    })
    //true
    

    对象

    1.新建对象(Object.create(.proto,propertiesObject))
    proto是一个对象,作为新创建对象的原型。可以为null
    propertiesObject 是一个对, 它有4个值和两个函数,分别是:
    • value : 设置属性的值

    • writable : 布尔值,设置属性是否可以被重写,默认属性值为false(不能被重写)

    • enumerable : 布尔值,设置属性是否可以被枚举,默认属性值为false(不能被枚举)

    • configurable : 布尔值,设置属性是否可以被删除,默认属性值为false(不能被删除)
      两个函数:

    • get : 函数,设置属性返回结果

    • set : 函数,有一个参数

    来看看具体的用法:

    writable:
    var account = Object.create(Object.prototype,{
               type: {
                       value: "建设银行",
                       //enumerable: false
                       //configurable: false
                       writable: false
               }
       });
      account.type="交通银行";
      console.log(account.type);  
      //建设银行,因为writable设置为false表示该属性不能被修改
    
    configurable:
    var account = Object.create(Object.prototype,{
               type: {
                       value: "建设银行",
                       //enumerable: false
                       configurable: false,
                       writable: false
               }
       });
       account.type="交通银行";
       delete account.type;
       console.log(account.type);  
       //交通银行,configurable: false表示不能删除该属性值
    
    enumerable:
    var account = Object.create(Object.prototype,{
               type: {
                     value: "建设银行",
                     enumerable: true,
                     configurable: false,
                     writable: false
               }
       });
     for(var i in account){
              console.log(account[i]); //建设银行,如果enumerable为true,那么打印undefined
      }
    
    get&&set look here
    2.检测对象属性是否存在(in):
    var obj={
            name:"veb"
    }
    console.log("name" in obj)//true
    
    3.枚举属性:

    (1)for in
    遍历对象中可枚举的属性。除开对象内置的继承属性,其余的自身属性或者来自原型对象上的继承属性都可以被枚举出来

    (2)Object.keys(obj)
    返回数组,每一项式obj中可枚举的自身属性的属性,不包含继承
    (3)Object.getOwnPropertyNames(obj)
    返回数组,包含所有的自身属性

    4.原型属性
    • 通过Object.getPrototypeOf(obj)来获取对象的原型
    • 通过obj.constructor.prototype来检测对象的原型
    • 通过obj2.isPrototypeOf(obj1)来检测obj2是不是obj1的原型
    5.对象序列化
    • 通过JSON.stringify(obj)来将对象转化为字符串
    • 通过JSON.parse(obj)来将字符串解析为对象

    bind

    之前改变函数内部this指向,大家会这么做:

    function fun(){
          this.say("hello");
    }
    var obj={
          say:function(a){
                console.log(a)
          }
    }
    
    //因为执行函数fun,内部this指向window;所以我们会这样处理;
    fun.call(obj)//hello
    

    call方法属于在调用函数的时候改变this指向!

    那么这跟bind有什么关系呢?
    bind用法如下:

    function fun(){
          this.say("hello");
    }
    var obj={
          say:function(a){
                console.log(a)
          }
    }
    var f=fun.bind(obj)
    f();//hello
    

    看到这,有的同学不干了,这比 call多了一步啊,我用 call多好了?

    注意:bind可以理解为在函数定义的时候改变 this指向。只不过返回了一个新的函数

    例如:

    function Fun(){
          this.name="veb";
          setTimeout(function(){
                  alert(this.name)
          },1000)
    }
    var person=new Fun()
    //undefined
    

    我们知道是this指向问题,所以这样改进:

    function Fun(){
          this.name="veb";
          var this_=this;
          setTimeout(function(){
                  alert(this_.name)
          },1000)
    }
    var person=new Fun()
    //veb
    

    但是这样处理会导致代码很不直观,
    使用bind如下:

    function Fun(){
          this.name="veb";
          setTimeout(function(){
                  alert(this.name)
          }.bind(this),1000)
    }
    var person=new Fun()
    //veb
    

    加油!

    相关文章

      网友评论

        本文标题:es5数组及对象处理方法

        本文链接:https://www.haomeiwen.com/subject/nptfzxtx.html