1.let关键字
1.不存在变量提升
2.有块级作用域
3.不能被重复声明
4.没有添加到window,没有预解析,预处理
2.const关键字
1.let有的属性特点const都有
2.const变量之不能改变,(特别提示:数组和对象是存的地址,数组和对象的地址不能改变但是里面的值可以改变,所以不能重新赋值一个数组或对象)
3.解构赋值
1.对象的解构赋值(按属性名解构)
2.数字的结构赋值(按顺序解构)
3.函数的参数可以用解构赋值
4.模板字符串(姓名:${person.name}
)
5.简化对象写法
const person={
name,
age,
setName(value){
this.name=value
}
}
6.形参默认值
实参传了值,就用实参值,没有传就用形参默认值
7.call,bind,apply区别
1.他们都改变this指向
2.call,apply都是立即执行函数,aplly中第二个参数是数组形式,call是item1,item2...
3.bind不会立即执行
1.普通函数直接调用 window
2.普通函数调用obj.fn() obj
3.new fn()对象 实例对象
4.fn.call/apply/bind(obj) obj
5.箭头函数this: 指向离它最近的一个包裹函数的this,如果没有则指向window
6.setTimeout window
事件绑定函数 绑定的dom对象
10.promise对象 (是一个异步编程解决方案,用来解决回调地狱问题)
let promise = new Promise((resolve, reject) => {
let xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState === 4){
if(xmlhttp.status === 200){
resolve(xmlhttp.responseText)
}else{
reject('报错')
}
}
};
xmlhttp.open('GET',URL)
xmlhttp.send()
})
promise.then((data)=>{
console.log(data)
},(error)=>{
console.log(error)
})
11.iterator
底层实现方法
function iteratorF(arr){
let index=0;
return {
next:function(){
return index<arr.length?{value:arr[index++],done:false}:{value:undefined,done:true}
}
}
}
let arr=[1,4,6,9,'dd'];
let iteratorObj=iteratorF(arr);
console.log(iteratorObj.next())
console.log(iteratorObj.next())
console.log(iteratorObj.next())
console.log(iteratorObj.next())
将iterator接口部署到指定的数据类型上,可以使用for of去循环遍历(数组 字符串 arguments set容器 map容器 )
12.async函数:真正意义上去解决异步回调的问题
语法:async function fn(){
await 异步操作
await 异步操作
}
13.class(实例化使用属性和方法的时候遵循就近原则)
class Father{
constructor(name,age){
this.name=name;
this.age=age;
}
money(){
console.log(100)
}
}
class Son extends Father{
constructor(name,age,sex){
super(name,age); // 调用父类的构造函数 相当于继承父类的属性
this.sex=sex //子类自己的属性应放在super的后面写
}
money(){
super.money(); //调用父类的普通函数
}
}