LET 关键字
用来替代了var的关键字
【特性】
- 不允许重复声明
- 没有预解析
- 块级作用域(遇到{}就会产生作用域)
【作用域】
一对 =={ }== 包括的区域称之为代码块
块级作用域指一个变量或函数只在该区域起作用【Dome1】
console.log(a);//会报错,a is not definedlet a = 3;//原来如果用var声明到调用后,不会报错,而是undefined,说明用var预解析了,但是用let不会
【Dome2】
//如果申明i的时候用原来的var,则每次定时器打出来的都是i,之前解决的方案就是利用函数的自执行,将每次的i传入函数中使用,但是如果用let申明i,就解决了问题,打出了0-9的数字。同样,也可以用在选项卡的例子中for(let i=0; i<10; i++){ setTimeout(function(){ console.log(i) },50); }
const 声明常亮
在定义之后值是固定不变的,即为常量
常量的值不能修改,但是如果常量保存的是一个对象,那么对象的属性是可以被修改可以理解为,对象本身是在堆内存中,它的值本身是可以修改的,但是它的引用地址在栈内存中,一旦用const申明后,引用地址是不能改的
【Dome】const a = 1;a = 2;console.log(a);//会报错:TypeError: Assignment to constant variable.
const a = 1;a = 2;console.log(a);//会报错:TypeError: Assignment to constant variable.
var存在的问题
- 可以重复声明
无法限制修改
代码的限制,严谨性可以开发大型项目
没有块级作用域
let 与 const
- 共同点:不能重复声明
- 不同:一个变量/一个常量
块级作用域
var btn = document.getElementsByTagName('button') console.log(btn); window.onload = function(){ for(var i = 0; i < btn.length; i++) { (function(i){ btn[i].onclick = function(){ alert(i) } })(i) } }
let btn = document.getElementsByTagName('button') console.log(btn); window.onload = function(){ for(let i = 0; i < btn.length; i++){ btn[i].onclick = function(){ alert(i) } } }
箭头函数
() => {}
- 如果只有一个参数,()可以省略
- 如果只有一个return {}可以省略
function(){ }()=>{ }
栗子: 排序
let arr = [5,61,62,15,4,7]// let newArr = arr.sort(function(n1,n2){// return n1 - n2// })let newArr = arr.sort((n1,n2) => { return n1 - n2})let newArr = arr.sort((n1,n2) => { n1 - n2 })console.log(newArr);
省略括号
输入a输出
let name = a => a * 2alert(asd(2))
函数的参数
- 参数扩展/展开
默认参数
剩余参数
参数扩展
- 收集剩余参数
- Rest Parameter(args)必须是最后一个
function show(a,b,...args){ alert(a); alert(b); alert(args);}show(1,23,3,2,54,5)// 1,23,[3,2,54,5]
扩展运算符
只能将数组展开,但是不能赋值
let aa = [1,2,3]let bb = [23,32,43]let arr = [...aa,...bb]alert(arr)//1,2,3,23,32,43
默认参数
我希望我没有传的时候默认值
show = (a,b=12,c=23) => a + b + calert(show(1))
必传参数
默认参数的一种应用
const required = () => { throw new Error('msg')}const add = (a = required(), b = required()) => a + b;alert(add(1,2))vv