ES6+知识点总结
前言
本文主要介绍的是ES6以及更新的JavaScript脚本语言标准规范的使用。主要是对相关知识点的自我认知和理解,如有不对的地方,望指出并探讨
一、变量的声明
1.let关键字
通过let关键字声明变量
let dzw = "大张伟";
let关键字声明的变量的特点:
- 没有声明提前(无建立阶段),不存在变量提升
- 有区域性,形成块级作用域
- 自动形成闭包
- 同一个作用域内,不能定义重复变量
- 不影响作用域链
- 存在暂时性死区:不能在声明之前,使用该变量(使用let声明的变量名,在let声明之前的使用,都是暂时性死区)
- 不会挂载到全局对象
- 相对const而言,let可以不用必须赋初始值
var关键字声明的变量特点
- 声明提前(有建立阶段),存在变量提升,(即是定义之前可以使用)
- 没有区域性,无法形成块级作用域
- 可以重估声明变量
- window环境下,使用var,会将该变量挂载到window对象上
1.let经典应用理解
- 循环中使用异步函数
var关键字
for (var i = 1; i <= 10; i++) {
console.log(i, "outer"); // 1 - 10
setTimeout(function () {
console.log(i, "inner"); // 10 个 11
}, i * 500);
}
分析:
var i = 1,首先是不会形成局部作用域的,而且会将i变量的声明提升至for循环体的外面,这里会挂载到window对象下,同步逻辑代码for循环执行完后 ,再执行 setTimeout异步代码,此时在setTimeout异步里面,存在变量i,但没有声明,所以会向父级作用域链查找,找到了window.i = 10++; 所以会打印10个11
使用IIFE,立即执行函数解决这个问题
for (var i = 1; i <= 10; i++) {
setTimeout((function (j) {
return function() {
console.log(j);
}
})(i), i * 500);
}
分析:
这里会把每次循环的变量i,传到setTimeout的回调函数里,使用闭包的方式,进行变量的保存,当然会存在闭包的缺点,比如变量无法销毁,导致内存的泄露
使用let关键字解决这个问题
for (let i = 1; i <= 10; i++) {
console.log(i, "outer"); // 1 - 10
setTimeout(function () {
console.log(i, "inner"); // 1-10
}, i * 500);
}
分析:
let i = 1; 不存在变量声明提升,而且会形成局部作用域{},将当前循环的变量保存到当前的作用域下;每次迭代都形成一个具有新的初始化let i的局部作用域,且每个let i 互不影响。之后的每一个初始化的i值,都是上一次迭代的i的结果,因此在同步for代码执行完后,再执行setTimeout,会在当前局部作用域下,找到之前保存的初始化的i变量值。 因为变量i的持久保存(遇到每个作用域的 } ,let销毁,作用域销毁),所以let会自动形成闭包
二、常量的声明
1.const关键字
通过const关键字声明常量
const DZW = "大张伟";
const定义的常量的特点:
- 有区域性,会形成局部作用域
- 无建立阶段,(不存在声明提前)
- 必须赋初始值,(与let的不同)
- 锁栈不锁堆,(基本类型不能更改,但是引用类型的属性还是可以更改的`
- 常量名一般的 需要全部大写
锁栈不锁堆的扩展:
使用Object.freeze(obj); 可以锁住对象(锁堆)
const DZW = {
age : 18
};
Object.freeze(DZW);
DZW.age = 35; // DZW 这个对象被冻结,其内部属性更改失败
console.log(DAW.age) // 18
三、扩展运算符:…
… 扩展运算符将对象或者数组,都用英文逗号隔开收集
应用一:使用扩展运算符实现数组的合并
let xing = ["大"];
let ming = ["张伟"];
let dzw = [...xing, ...ming]; // ["大","张伟"]
应用二:数组克隆
let dzw = ["大","张伟"];
let _dzw = [...dzw];
console.log(_dzw);
应用三:类数组转数组
function add() {
// 类数组 Array.isArray(arguments)
console.log(arguments, Array.isArray(arguments)); // [Arguments] { '0': 1, '1': 2, '2': 3 } false
let _argu = [...arguments];
console.log(_argu, Array.isArray(_argu)); // [ 1, 2, 3 ] true
}
add(1, 2, 3);
应用三:求数组中的最大值
var arr = [1,3,5,7,2,9,8];
// var max = Math.max(1, 3, 5, 7, 2, 9, 8);
// var max = Math.max.apply(Math,arr); //apply所接收的参数是一个数组
var max = Math.max(...arr);