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
加油!