1. let
let 语句允许使用块作用域声明变量。
console.log(a);
let a = 4;
// a is not defined
2. const
将所有字母都大写的变量约定为常量,但本质还是变量 ####1.const定义只是地址不能修改
const NUM = 100;
NUM = 200;
// Assignment to constant variable.
由const定义的常量,无法修改其地址值。 在这里为啥要强调是地址值 因为 以下代码在非严格模式下是可以通过的
const OBJ = {a: 100};
OBJ.a = 200;
console.log(OBJ.A);
// 200
这时候会发现这很坑啊!!! 怎么办呢,如果我们想要定义一个常量对象呢
const OBJ = {a: 100};
Object.freeze(OBJ);
OBJ.a = 200;
console.log(OBJ.a);
// 100
这样就可以了…
3. 幂 (**)
指数运算符----取幂运算符(**)将第一个操作数提升到第二个操作数的幂。
x ** y 的结果与 Math.pow(x,y) 相同:
4. 默认参数值
ES6 允许函数参数具有默认值。
function myFunction(x, y = 10) {
// y is 10 if not passed or undefined
return x + y;
}
myFunction(5); // 将返回 15
5. Array.find()
find() 方法返回通过测试函数的第一个数组元素的值。
此例查找(返回)第一个大于 18 的元素(的值):
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction);
function myFunction(value, index, array) {
return value > 18;
}
6. Array.findIndex()
findIndex() 方法返回通过测试函数的第一个数组元素的索引。
此例确定大于 18 的第一个元素的索引:
var numbers = [4, 9, 16, 25, 29];
var first = numbers.findIndex(myFunction);
function myFunction(value, index, array) {
return value > 18;
}
老生常谈的闭包问题 实质上就是为了解决没有块级作用域带来的问题。
闭包
* 外部函数(作用域)中有内部函数(作用域)
* 内部函数调用了外部函数的局部变量
* 外部函数执行完后,因为内部函数还在使用该局部变量,所以该局部变量不被释放,保证内部函数正常使用
* 闭包函数(立即执行函数)为
(function(){
// ...函数体
})();
var aLi = document.getElementsByTagName('li');// len = n
for(var i = 0; i < aLi.length; i++){
aLi[i].onclick = function(){
console.log(i);
}
}
// n......n
var aLi = document.getElementsByTagName('li');// len = n
for(var i = 0; i < aLi.length; i++){
(function(i){
aLi[i].onclick = function(){
console.log(i);
}
})(i)
}
// 0、1、2....n
for循环实质可以理解为 由n个”{}”构成的,在每个花括号中,let的作用域都是独立的,所以可以拿到每个i值。 但对于var来说实质是一个作用域,所以无法保留每个i的值。