ES5:提供了一些新的API
1、保护对象:保护对象的属性和方法
1、四大特性可以保护对象:
1、对象的每一个属性都要4大特性,3个开关默认为true
{
value: 1001,//保存实际值的地方
writable: true,//开关:控制属性是否可以被修改
enumerable: true,//开关:控制属性是否可以被for in循环遍历
configurable: false//开关:控制属性是否可以被删除,总开关,一旦设置为false就不会允许修改其他特性,它本身一旦改为false不可逆
}
2、修改对象的某个属性的四大特性:
Object.defineProperties(obj,{
"属性名":{四大特性},
...
})
2、三个级别:
1、防扩展:防添加
Object.preventExtensions(obj);
2、密封:防添加防删除
Object.seal(obj)
3、冻结:防添加防删除防修改
Object.freeze(obj);
个人不推荐:
1、如果以后你使用面向过程开发,保护个毛啊
2、前辈们都没有保护,你保护个毛啊
2、*****数组的新的API:3组6个
1、判断: 判断数组中的元素是否满足我们的条件
1、every:判断数组中的元素是否【都】满足我们的条件,类似于我们的&&,只要有一个为false则为false
2、some:判断数组中的元素是否【包含】满足我们的条件,类似于我们的||,只要有一个为true则为true
语法:arr.every/some(function(val,i,arr){
//val:当前值
//i:当前值的下标
//arr:数组本身
//虽然提供了3个形参,但是到底要用几个看我们自己
//切忌:函数自带return undefined;
return 判断条件;
})
2、遍历:把数组中的每个元素取出来执行相同 或 相似的操作
1、*****forEach:直接修改原数组
arr.forEach(function(val,i,arr){
直接写操作;
})
2、*map:不修改原数组,直接返回新数组
var newArr=arr.map(function(val,i,arr){
return 直接写操作;
})
3、汇总和过滤:
-
3.1、过滤:筛选出符合条件的元素: - 不会修改原数组
var subArr=arr.filter(function(val,i,arr){ return 判断条件; }) -
3.2、汇总:将所有的数组的元素进行+-*/
var sum=arr.reduce(function(prev,val,i,arr){ return prev+val; },base)
总结 : 以上6个API简化for循环
3、
var 子对象=Object.create(父对象,{
"属性名":{四大特性},
......
}) - 根据一个父对象创建一个子对象并且继承已经设置完毕,提前保护对象
4、*****call/apply/bind:替换了函数中的this
1、call/apply:临时替换了函数中的this - 借
差别:
- call:要求传入的实参必须单独传入
- apply:要求传入的实参必须整理为一个数组,只能传一个数组参数
强调: call/apply相当于立刻调用函数
用法:
- 方法名.call(借用的对象,实参,...)
- 方法名.apply(借用的对象,[实参,...]) - apply自动打散数组
固定套路:
-
Object.prototype.toString.call/apply(数组) -
Math.max/min.apply(Math,arr);
*关键点:
-
将类数组转为普通数组 -
lis=Array.prototype.slice.call(lis);
2、bind:永久替换了函数中的this - 买
3件事
1、创建了一个函数功能和原函数完全一样
2、将新函数的this永久绑定为了你指向的对象
3、将新函数中的部分固定参数提前永久绑定
用法:
-
var 新方法名=方法名.bind(永久绑定的对象,永久绑定的实参,...); -
不会立刻执行,需要我们程序员手动调用
建议:
- 如果你的这方法要经常反复使用,可以使用bind - 买
- *如果你需要一个方法立刻就要执行,建议call/apply - 借
5、严格模式:
开启严格模式:"use strict"; - 可以出现在任何作用域的顶部
用处:
1、禁止给未声明的变量进行赋值
2、将静默失败升级为错误