1、ES5: 1、保护对象:保护对象的成员(属性和方法) 如何保护: 1、四大特性: { "value": 1001,//实际保存值的 "writable": true,//开关:控制着这个属性是否可以被修改 "enumerable": true,//开关:控制着这个属性是否可以被for in循环遍历到 "configurable": true//开关:控制着这个属性是否可以被删除 }
如何修改四大特性:
Object.defineProperties(obj,{
"属性名":{四大特性},
...
})
2、三个级别:
1、防扩展:禁止给对象添加新属性
Object.preventExtensions(obj);
2、密封:禁止给对象添加新属性和删除属性
Object.seal(obj);
3、冻结:禁止给对象添加新属性和删除属性和修改属性
Object.freeze(obj);
其实保护对象对于我们程序员并没有用处,为什么?
1、如果你用的是面向过程开发,你保护个屁
2、别人基本不可能知道我们的对象名叫什么
3、前辈们都没有保护,你保护个啥
2、*****数组的新的API:3组6个:
1、判断:2个
1、every - 每一个 - 要求每一个元素都要满足,结果才为true,只要有一个不满足就为false - 类似于&&
语法:
var bool=arr.every(function(val,i,arr){//
console.log(val);//保存的是当前的值
console.log(i);//保存的是当前的值的下标
console.log(arr);//数组本身
return 条件;
})
2、some - 有一些 - 要求每一个元素都要不满足,结果才为false ,只要有一个不满足就为true - 类似于||
语法:
var bool=arr.some(function(val,i,arr){
return 条件;
})
2、遍历:将数组中的每个元素取出来执行相同 或 相似的操作
1、forEach:直接修改原数组
语法:
arr.forEach(function(val,i,arr){
直接做操作
})
2、map:不修改原数组,返回一个新数组
var newArr=arr.map(function(val,i,arr){
return 操作;
})
3、过滤和汇总:
过滤:筛选出自己想要的,但是不会修改原数组。
var subArr=arr.filter(function(val,i,arr){
return 条件;
})
汇总:把数组种的每个元素汇总到一起
var sum=arr.reduce(function(prev,val,i,arr){
return prev+val;
},基础值)
以上6个API,底层都是for循环,对其进行了简化
3、Object.create(); - 根据父对象创建子对象,继承已经设置好了
var 子对象=Object.create(父对象,{
"属性名":{四大特性},
...
});
4、面试题:严格模式 - 很严格
开启:在你的任何作用域的顶部加上一句话:"use strict";
功能:1、禁止给未声明的变量赋值 - 解决了全局污染
2、将静默失败升级为报错
5、*****call/apply/bind:不是自己的方法也可以使用 - 笔试面试开发都很容易用到:
call/apply:临时替换了函数中的this - 借用
语法:函数名.call(借用的对象,实参,...); - 单独传入每一个实参
函数名.apply(借用的对象,arr); - 只能传入一个实参是一个数组,apply其实会悄悄的将数组打散为单个元素
强调:call/apply,相当于立刻调用函数,立刻执行
bind:永久替换了函数中的this - 买
3件事:
1、创建了一个和原函数功能完全相同的新函数
2、将新函数中的this永久替换为了指定对象,别人都借不走了
3、将新函数中的部分参数永久固定
用法:var 新函数=函数名.bind(指定对象,永久实参,...); - 不会立刻执行的,需要自己调用
强调:bind绑定的新函数没办法被call/apply借走
个人更推荐:call/apply - 白嫖
固定套路:3个
1、Math.max/min.apply(Math,arr);
2、Object.prototype.toString.call/apply(arr)==="[object Array]"
3、***类数组转为普通数组:lis=Array.prototype.slice.call(lis);
ES6:语法较大的变化
1、*模板字符串:可以在字符串中放入变量 - 不需要再做字符串拼接了,实现了一个简单的js环境
语法:我的名字叫${name};
2、*let关键字:尽量以后优先使用let创建变量
let 变量名=值;
作用:
1、禁止声明提前
2、带来了块级作用域:{}就是一个块级作用域
3、记录着当前触发事件的元素的下标
3、***箭头函数:简化一切的回调函数
公式:去掉function,()和{}之间添加=>,如果形参只有一个,省略(),函数体如果只有一句话,省略{},函数体只有一句话并且是return,return和{}都省略
4、for...of循环:垃圾
for(var v of arr){
v;//当前值
}
缺点:1、不能修改原数组,只能返回新数组
2、不能遍历hash数组,意味着不能遍历对象,只能遍历索引数组
二阶段结束之前,再将5个ES6的新特性教给大家,三阶段必用
作业: 1、摇号功能 2、使用let完成要给选项卡 3、保护对象(四大特性、三个级别)试试 4、六个数组API一定要好好写案例尝试一下 5、call/apply/bind