【点赞收藏加关注,前端技术不迷路~】
一、ES6都有哪些东西
1.模板字符串:${}
${}规则和今后各种框架中的绑定语法规则完全一样
可以放:一切有返回值的js的东西 (变量、算术计算、三目运算、对象属性、创建对象、调用函数、访问数组元素 —— 有返回值的合法的js表达式)
不能放:没有返回值的js表达式、分支/判断/循环等程序结构 —— 比如:if else for while……等
例子:${name}、${sex==1?'男':'女'}、${price.toFixed(2)}、${count}、${price*count}、${arr[num1]}、${new Date().toLocaleString()}……
2.let
1)var的问题:
1.声明提前:hoist,提升的不止是变量,还有函数 —— 打乱程序正常的执行顺序
2.没有块级作用域:for循环,if else 分支等不是作用域,拦不住声明提前 —— 代码块内的变量会超出代码块范围,影响外部的变量。比如:if(false)会导致原本并不执行的代码,影响当前作用域。虽然if(false){}内的代码不执行,但是var t=new Date()仍会拆分出声明语句var t;,然后提前到当前函数的顶部,那么fun1中原本想加到全局变量t上的0.8,就因为if(false)内不执行代码的声明提前,导致加到了局部变量t中。
2)什么是块级作用域?js中是没有的
除了对象{}和function的{}之外,其余if else、for等分支和循环结构的{}范围,在其他语言中称为块级作用域。其他语言中,程序块{}内的变量,出了所在的程序块{},就不能使用。
而在js中,for()内声明的i,在{}外依然可以使用,不会报错。
3)用let替换掉var
let特点
1.声明不提前 —— 保证程序顺序执行
2.块级作用域 —— 让程序块,也变成了”块级作用域“,保证块内的变量,不会影响块外的变量
let根本:底层会被翻译成匿名函数自调
let t=new Date();
console.log(t);
自动添加匿名函数自调:
(function(){
var t=new Date(); //这里的t当然是局部变量,而不会影响外部了
console.log(t);
})();
4)let特别注意:
1.因为不会声明提前,所以不能在声明变量之前,提前使用该变量
底层相当于匿名函数自调,包裹不了之上的代码,相当于外部变量没声明
2.在相同作用域内,禁止声明两个同名的变量
3.因为let底层相当于匿名函数自调,所以,即使在全局创建的let变量,在window中也找不到