es5数组及对象处理方法

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

再强调一下:改变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数组及对象处理方法)