一、ES5:
1、保护对象:保护对象的成员(属性和方法)
如何保护:
① 四大特性 - 每一个属性或方法都有四大特性
如何设置四大特性:
Object.defineProperties(obj,{
"属性名":{
value: 实际保存值的地方,
writable: true/false,//开关:控制着这个属性是否可以被修改
enumerable: true/false,//开关:控制着这个属性是否可以被for in循环遍历到
configurable: true/false,//开关:控制着这个属性是否可以被删除
}
})
② 三个级别:
(1)防扩展:禁止给对象添加新属性
Object.preventExtensions(obj);
(2)密封:禁止给对象添加新属性和删除属性
Object.seal(obj);
(3)冻结:禁止给对象添加新属性和删除属性和修改属性
Object.freeze(obj);
2、数组的新的API:3组6个
① 判断:判断结果一定是一个布尔值
(1)every:每一个 - 要求每一个元素都要满足,结果才为true,只要有一个不满足,结果则为false - 类似&&:碰到false就不会再执行后续操作了
语法:
arr.every(function(val,i,arr){
//val - 当前值
//i - 当前下标
//arr - 数组本身
return 判断条件
})
(2)some:有一些 - 要求每一个元素都不满足,结果才为false,只要有一个满足,结果则为true - 类似于||:碰到true就不会再执行后续操作了
语法:
arr.some(function(val,i,arr){
return 判断条件
})
② 遍历:将数组中每一个元素取出来执行 相同 或 相似的操作
(3)forEach:遍历数组,直接修改原数组
语法:
arr.forEach(function(val,i,arr){
直接做操作
})
(4) map:遍历数组,不修改原数组,返回一个新数组
语法:
var newArr=arr.map(function(val,i,arr){
return 操作;
})
③汇总和过滤:
(5)过滤:筛选出自己想要的,但是不会修改原数组
语法:
var newArr=arr.filter(function(val,i,arr){
return 判断条件;
})
(6)汇总:把数组中的每个元素都汇总到一起
语法:
var result=arr.reduce(function(prev,val,i,arr){
return prev+val;
},基础值)
以上6个API的底层都是for循环,目的 - 简化for循环
3、Object.create():希望根据父对象创建子对象,继承自动设置完毕
语法:
var 子对象=Object.create(父对象,{
"自有属性":{四大特性},
...
})
4、面试:严格模式:很严格
开启:在你的任何作用域的顶部都可以加上这句话:"use strict"
功能:① 禁止给未声明的变量赋值 - 解决了全局污染
② 静默失败升级为错误
5、call/apply/bind:不是自己的方法也可以使用,不管是笔试、面试、实际开发都很常用
① call/apply:【临时替换函数中的this】 - 借用
语法:函数名.call(借用的对象,实参,...); - 单独传入每一个实参
函数名.apply(借用的对象,[实参,...]); - 只能传入一个实参,是一个数组,但是其实apply也会悄悄的将数组打散
强调:call/apply,相当于立刻调用函数,立刻执行
② bind:【永久替换了函数中的this】 - 买
3件事:
① 创建了一个和原函数功能完全相同的新函数
② 将新函数中的this永久的绑定固定为了指定的对象,别人借不走
③ 将新函数中的部分参数永久固定
语法:var 新函数=原函数.bind(指定对象,永久固定参数,...); - 不是立刻执行,需要自己调用
强调:bind绑定的新函数是没有办法被call/apply借走的
固定套路:
1、Math.max/min.apply(Math,arr)
2、Object.prototype.toString.call/apply(arr)==="[object Array]"
3、类数组转为普通数组:保存一下=Array.prototype.slice.call/apply(类数组)
二、ES6
1、模板字符串:可以再字符串中放入变量,不需要在做字符串的拼接了,简化了输入法的切换,${}还实现了一个简单的js环境
语法:`我的名字叫${name}`
2、块级作用域:尽量以后创建变量【优先】使用let关键字
let 变量名=值;
作用:
① 禁止了声明提前
② 添加了块级作用域:一个{}就是一个块
③ 记录着当前触发事件的元素的下标
3、箭头函数:简化回调函数
公式:去掉function,在()和{}之间添加=>,如果形参只有一个,省略(),如果函数体只有一句话,省略{},如果函数体只有一句话并且是return,return和{}都省略
特殊:千万不要将事件也简化为箭头函数 - this会失效 - 暂时
4、for of循环
for(var v of arr){
v;//当前元素
}
缺点:① 不能修改原数组,只能返回新数组
② 不支持hash数组,不支持对象