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);

猜你喜欢

转载自blog.csdn.net/weixin_44224921/article/details/127757333