let和const命令
1.let的命令作用域值限于当前代码块 即{}中
2.使用let声明作用域不会被提前
3.在相同作用域不能重复声明一个同一个变量
1.const不能被提前声明 属性时值也不能被修改 而对象时可修改值但是不能修改对象的地址
(对于简单的数据如数值字符串等,值就保存在内存地址中 而引用数据类型的数据 常量指向的内存地址只是一个保存对象的地址 const只能保证地址不被改变)
2.const也是块级作用域
3.使用 let 声明的变量 i 具有块级作用域,每次迭代都会创建一个新的变量 i 并绑定到当前循环的值。而在每次循环中,函数表达式被赋值给 arr[i] 时,它捕获并保存了当时的 i 的值。这就意味着每个函数都有自己独立的 i 值,因此调用 arr1 时返回的是函数在创建时捕获的当前 i 值,也就是 1。
var arr=[];
for(let i=1;i<10;i++){
arr[i]=function(){
return i;
}
}
console.log(arr[1]())
模版字符串
将需要一个html结构插入到网页中 就可以使用这个方法
let htmlstr=`结构 需要变量可使用${}`;
然后追加到html文档上
参数默认值
!!!参数变量是默认声明的 不能使用let和const再次声明
!!!函数不能有同名的参数
!!!参数默认值要放在后面 要不然会报错
es6引入了一个写法 当你带参的方法不需要传参数时 可让形参有个默认值
自己传入的参数等级高 优先使用
function a(b=10,c=10){
//方法体
}
函数也可以作为默认表达式
function add(a,b=a(5)){
return a+b;
}
function a(b){
return b+10;
}
解构赋值
完全解构
let [a,[b],c]=[1,[2,3],4] //数组中的b有用[]括起来的 赋值时也需要 使用[]第一个值进行赋值
console.log(a,b,c)
不完全赋值
let [a,[b]]=[1,[2,3],4]
console.log(a,b) //a=1,b=2
会将第一个值赋给变量
let [a,,b]=[1,[2,3],4]
console.log(a,b)
这种写法也会解构成功 我自己理解是根据,而去定位赋值的
使用扩展运算符赋值
let [a,...b]=[1,[2,3],4]
console.log(a,b) //a=1.b=[[2,3],4]
解构默认值
let [a,b=1]=[2]
console.log(a,b) //a=2,b=1
对象解构赋值
数组的元素是按照次序排序的 变量的取值由他的位置决定的 而对象的属性没有次序 变量需与属性同名才能取到值
let obj={
name:'小填',
age:1
}
let{name,age}=obj;
console.log(name,age);
解构数组嵌套对象
//p数组中有个对象 包含着age
let obj={
p:['小填',{age:1}]
}
let{p:[name,age]}=obj;
console.log(name,age);
不完全解构
//p数组中有个对象 包含着age
let obj={
p:['小填',{age:1}]
}
let{p:[name,age,z]}=obj;
console.log(name,age,z); name=小填age=1,z=undefined z值未能赋值成功
剩余运算符
//p数组中有个对象 包含着age
let [a,b,...c]=[1,2,3,4,5]
console.log(a,b,c); //a=1,b=2,c=[3,4,5]
解构默认值
let {a=5,b=3}={a:6}//6覆盖5
console.log(a,b); //a=6 b=3
字符串解构赋值
一个一个匹配
let [a,b]="123"
console.log(a,b); //a=1 b=2
函数参数解构赋值
function a([b,c]){
return b+c;
}
console.log(a([1,1]));
rest参数和name属性
rest相当于扩展运算符 这里就不写了
name返回的是一个函数的名字
在es5中返回“”在es6中返回f
箭头函数
为什么有箭头函数呢
就是因为有些函数的作用域是全局 导致this.属性获取不到当前函数属性获取到的是全局的变量 导致为空 因此箭头函数出现了 解决了这个问题 也大大减少了代码量
语法:
(参数1,参数2,…)=>{函数声明}
(参数1,参数2,…)=>表达式(单一)
//当只有一个参数时 圆括号是可选的
(单一参数)=>{函数声明}
单一参数 =>{函数声明}
//没有参数的函数应该写成一对圆括号
()=>{函数声明}
let a=(i)=> console.log(i);
a(1)
-------------------------
()=> console.log(1);
和普通函数的区别
!!!箭头函数的this永远指向当前
!!!箭头函数的arguments有问题 使用扩展运算符获取传入参数值
!!!使用箭头函数 当前失去了作用域链 往上一级寻找
!!!箭头函数不是一个对象 相当于一个语法
!!!箭头函数不能定义构造函数 也不能定义原型方法