es5数组及对象处理方法

index

es5数组及对象处理方法 __veblen

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


加油!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • es6已经出来了,为什么还要整理es5?因为知识不是跳跃的,就像已经出来vue、react这样的框架,你还是需要j...
    Veb阅读 9,276评论 3 21
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,165评论 0 5
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,695评论 0 21
  • 属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。 上面代码表明,ES6允许在对象之中,直接写...
    oWSQo阅读 3,465评论 0 0
  • 《被动》上卷 知有飘零 楔子 - 简书 第一章 《囚鸟》 2012年,帝都,某超五星级酒店顶层。 这是套2000多...
    矜風阅读 3,555评论 0 3

友情链接更多精彩内容