let const的使用
为什么要推出 let const
因为var的使用本身存在一些问题
使用var导致的问题
- 污染全局变量
- 存在变量提升问题。(function也存在变量提升问题)
- var可以被重复声明
let 和 const 对上述问题的解决
- let 和 const 只在当前作用域范围内生效(常见的作用域有全局作用域、函数作用域),不会将声明的变量挂载在window上。
- 不存在变量提升,所以会存在暂存死区的问题。
let a = 100
{
console.log(a) // undefined 暂存死区
let a = 200
}
- 变量不能重复声明
const
- 一般const声明常量,字母全大写。
- 常量指的是地址不变的量,一个对象常量的属性可以改变,因为其地址没有发生变化。
...展开运算符
- 把两个数组合成一个数组
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1,...arr2]
- 把两个对象合成一个对象
let name = {name:'ccc'}
let age = {age:18}
let person= {...name,...age}
该方法只能拷贝一层,是浅拷贝。
set , map 两种存储结构
set
- set 不能重复,返回的值可迭代
- set 具备一些增删改查的方法
用set 处理集合
let s1 = [1, 2, 3, 4, 6, 2, 3]
let s2 = [4, 5, 3, 2, 1]
- 并集
function union(s1, s2) {
let unionArr = [...new Set(s1), ...new Set(s2)]
return [...new Set(unionArr)]
}
- 交集
function intersection(s1, s2) {
return [...new Set(s1)].filter(item => {
return new Set(s2).has(item)
})
}
- 差集
function diff(s1,s2) {
return [...new Set(s1)].filter(item => {
return !new Set(s2).has(item)
})
}
map
map是有key的,不能放重复的
map对象使用set()函数时,所引用的对象,即使该引用对象被清空,引用的空间还是存在的。
weakMap
weakMap的key必须是对象类型的
map有引用关系,不会销毁,会占用内存空间;weakMap没有引用关系,会销毁,不会占用内存空间。
箭头函数
- 没有this
- 没有arguments
- 不会变量提升
- 返回一个对象
let a = (x,y)=>({total:x+y})
数组的方法
es5的方法
forEach、reduce、map、filter、some、every
reduce
求和 , 将多个数据,最终变成了一个数据
// 自实现reduce
let arr = [1, 2, 3]
// 一个参数是函数,一个初始化的值(也是最终返回会的值)
// 函数的参数为 a数组的第一个值, b数组的第二个值, index当前值的索引, current当前数组
Array.prototype.reduce = function (callback, initData) {
// 循环数组
for (let i = 0;i<this.length;i++) {
// console.log(i,initData,this)
// 判断是否有初始的值
if (initData == undefined) {//初始无值
initData = callback(this[i], this[i+1], i+1, this)
i++
} else {
initData = callback(initData, this[i], i, this)
}
}
return initData
};
let res = arr.reduce((a, b,index,arr) => a+b);
console.log(res)
es6的方法
find、findIndex
es7
includes
es6的类
每个实例的_proto_指向所属类的prototype(原型)
es6的规范里 如果单独调用原型上的方法 this是不存在的 undefined
类的装饰器
装饰器是一个函数,不仅可以装饰类,还可以装饰方法的属性。
不可以装饰函数,因为函数存在变量提升
类的装饰器
装饰器是一个对类进行处理的函数。装饰器函数的第一个参数,就是所要装饰的目标类
注意,装饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,装饰器能在编译阶段运行代码。也就是说,装饰器本质就是编译时执行的函数。
方法的装饰器
- 装饰器第一个参数是 类的原型对象
- 第二个参数是 所要装饰的属性名
- 第三个参数是 该属性的描述对象