ES5增加的一些功能
ES5是ECMAScript的第五个升级版本
在原有的js中增加了
1.严格模式:使用严格模式在当前代码段的顶部添加字符串:“use strict”
use strict翻译使用严格的
严格模式的4个新要求:
1.禁止给未声明的变量赋值 在非严格模式下没有声明的变量是会自动在全局创建该变量的,在严格模式下是禁止的,严格模式必须声明变量才能使用该变量
<script>
//在顶部声明严格模式
"use strict"
//在非严格模式下,是可行的,会自动在全局创建的,但是在严格模式下是会报错的
a = 1;
console.log(a)//Uncaught ReferenceError:a is not defined
</script>
2.静默失败:在非严格模式中,执行不成功,但是不会报错.ES5对这一情况进行了改善.在严格模式下,已经将所有的静默失败都升级了错误,在这个情况下便于调试,避免歧义
3.普通函数调用和匿名函数自调中的this默认指undefined,而不再指window
<script>
//在非严格模式下
function Student(sname,sage){
this.sname = sname
this.sage = sage
}
//正确的使用构造函数
var zz = new Student('zhuzhu',11)
console.log(zz)//{sname :zhuzhu,sage:11}
//错误的使用构造函数 Student函数变成了普通函数 普通函数中的this指向window
var hbb = Student('hanbinbin',9)
console.log(hbb)//undefined
console.log(window.sname)//hanbinbin
</script>
<script>
//在严格模式下
function Student(sname,sage){
this.sname = sname
this.sage = sage
}
//正确的使用构造函数
var zz = new Student('zhuzhu',11)
console.log(zz)//{sname :zhuzhu,sage:11}
//错误的使用构造函数 Student函数变成了普通函数 普通函数中的this指向undefined
var hbb = Student('hanbinbin',9)
//报错:Uncaught TypeError: Cannot set property 'sname' of undefined
//不能 修改的 属性 sname 在 undefined中
console.log(hbb)
console.log(window.sname)
</script>
4.禁止使用arguments.callee
arguments.callee 可以自动获取当前函数对象本身,直接用当前函数对象进行递归调用,与函数名无关了
严格模式下禁用: 因为递归调用效率太低了,重复计算量太大
2.保护对象
阻止对对象的属性进行不符合规定的修改
ES5中把每个对象的属性,变成了一个小对象
获得对象中一个属性的描述小对象
var 属性的描述对象 = Object.getOwnPropertyDescriptor(对象,"属性名")
描述小对象
{
configurable: true //是否可以配置当前描述小对象
enumerable: true //是否可以被枚举
value: 1 //保存值
writable: true //是否可以值修改
}
修改对象中一个属性的描述小对象
Oject.defineProperty(对象,"属性名",{
开关名:true 或 false
})
修改对象中多个属性的描述小对象
Oject.defineProperties(对象,{
属性名:{
开关名:true或false
}
})
总结:
保护对象,在ES5中添加了对象的属性的描述对象,用于控制对象属性值的修改/枚举和配置描述小对象,但是不够灵活所以有访问器属性
访问器属性
用访问器属性保护数据属性不是为了阻止大家使用,而是为了保证大家在合理的范围内使用属性
定义访问器属性:第一步: 先将要保护的属性,隐姓埋名,半隐藏
第二步: 为受保护的属性,请保镖: 保镖就是访问器属性,但是为对象添加访问器属性,不能直接在对象的{}内添加。只能通过Object.defineProperty()或Object.defineProperties()添加
保镖要冒名顶替原属性名: 访问器属性的名称,应该和想要保护的哪个数据属性名一致,才能起到替身的作用。
保镖一请就是一对儿: get:function(){ reutrn this.受保护的变量}
set:function(value){ ... }
其中get和set不能改变,必须这么写
3.call/apply/bind
这三个函数相同点:都是用来替换函数中不想要的this为想要的对象
这三个函数不同点:
call:只在调用函数时,临时替换一次this为指定的对象
apply:apply拥有call相同的功能,都能调用函数,并替换其中this为指定对象,但是apply比call多一个功能,apply先打散数组为多个值,在传参
bind:会创建一个和原函数一模一样的新函数副本,永久绑定新函数副本中的this为指定对象,而且永久绑定一个或多个实参值到形参变量上。(可以绑定多个实参值,但是按顺序绑定)
4.数组新增函数
//判断两个
//判断数组中是否包含符合条件的元素
var bool=arr.some(function(val){
return 判断条件
})
//判断数组中是否所有元素都符合条件
var bool=arr.every(function(val){
return 判断条件
})
//遍历2个
//仅单纯遍历原数组中每个元素
arr.forEach(function(val){
对val的操作
})
//遍历元素数组中每个元素,修改后,放入新数组中返回
var 新数组=arr.map(function(val){
return 根据当前元素值val,修改后的一个新值
})
//过滤和汇总
//复制出原数组中符合条件的元素组成新数组返回,原数组保持不变
var 新数组=arr.filter(function(val){
return 判断条件
})
//遍历数组中每个元素,对所有元素进行统计,最终得出一个统计结果
var 统计结果=arr.reduce(
function(prev, val){
prev+=val;
return prev
},
起始值
)