es6 const
1. 定义变量 但是 值是常量,一但赋值不能改变
2. 不能重复定义变量
3. 没有变量提升
4.不会给window添加属性
变量的解构赋值
解构赋值
数组解构赋值
1. 前后模式必须匹配
后面的值是什么格式,前面的变量也得是什么格式
后面值是二维数组,前面的变量声明的时候也得是二维模式
2.前多后少
前面声明的变量多,后面赋值的值少,解构不成功,就相当于只声明了变量,但没赋值,解构不成功的变量值都是undefined
3.钱少后多
1.省略赋值
2.不定参数解构赋值 使用... 叫拓展运算符 ...as将后面的值以数组的形式赋值给 as 拓展运算符必须写在后面
4.带默认值的问题
问题 先给默认值再解构赋值? 还是先解构赋值, 不考虑默认值?
let [x,y=(function(){console.log("haha");return 10;})()]=[45,23]
console.log(y)
没有输出haha说明不是先给默认值,而是先解构赋值,不在考虑默认值。
所有 就是解构不成功的时候,才会用默认值。就是没有赋值,没有定义
var a=null a=[] a={} a="" 这都叫定义了
var a=undefined 才叫没定义
所以只有结构的时候,后面是undefined的时候,才会用默认值,否则后面给什么就赋值什么。
对象解构赋值
1.变量和属性名必须同名,才可以解构赋值
2.如果结构失败 值是undefined
3.如果变量名跟属性名不一致
前面name是属性 后面aa是变量。解构的机制,是对应的属性值赋值给后面的变量。
4.对象解构的默认值问题
默认值跟数组解构的默认值是一样的,解构成功就直接赋值,不执行默认值,解构不成功就是没有值,或者值是undefined执行默认值。
let{name,age=45}={name:"zhang"} age=45 解构不成功
let{name,age=45}={name:"zhang",age:undefined} age=45 结构不成功
let{name,age=45}={name:"zhang",age:12} age=12
let{name,age=45}={name:"zhang",age:null} age=null
5.对象解构赋值的注意点
{}前面不能没东西 {a}={a:12} x
6.等号右边在什么情况下能解构?
等号右边的值只要带有length属性,都可以解构
函数参数的解构
1、函数参数的默认值
前面是形参 后面是默认值。带默认值的参数尽量写后面。
函数参数 等号左边是形参 右边是默认值 函数调用是不传参,走函数形参默认值,函数调用传参,默认值就不走了,走实参。
2、函数参数的解构赋值
3、函数作用域
函数在调用的时候会形成一个私有作域,在这个作用域下声明的变量和参数变量都是私有变量,外界访问不到,同时它在操作相同的变量时,不会操作外部的。
4、函数的一个类数组参数arguments 是实参构成的集合是一个类数组
还有一种方式可以得到实参
5.箭头函数
1.箭头函数只使用与匿名函数
let fn=function(){} 匿名函数
做回调函数 fn(12,function(){})
匿名函数:只要不是关键字function 声明的函数都叫匿名函数
let fn=(形参)=>{函数体}
每个函数结束的时候一定要return
当有一个参数的时候可以省略return
2.当只有一个参数的时候可以省略()
3、当函数体只有一行代码 且是return xxx; 时候可以省略{}和return
箭头函数的优势
1.箭头函数没有this指向
函数中改变this指向的方法
1.在函数提前对this赋值,that=this
2.在函数的结尾处{}.bind(this)
3.在函数的结尾处{}.apply(this)或者是{}.call(this)
4.使用箭头函数
2.箭头函数获取实参,不能使用arguments 用...arg
3.箭头函数不能充当类
因为里面的this指向window 而类中的this指向当前实例对象
函数的角色
函数可以扮演类 普通函数 Function的实例对象
类
每个类身上天生有一个prototype的属性,这个属性是一个对象,里面有一个constructor属性,属性值是他的类。
注意
1.Object 是所有对象的基类 包括 window event等
2.普通函数的父类Function
3.通过function定义的类,它的父类是Function
4.所有示例对象的__proto__都指向父类的原型prototype
对象.属性
首先看对象中私有的属性中有没有设个属性,有就直接用,没有就使用__proto__向他的父类的原型(prototype)上查找