文章目录
前言
规范规定的原因:减少运行时错误,规范编码习惯,执行严格的编码规范;ES6新增的特性也大部分实现了该目的。
1.新增变量声明:let&const
var的特性
- var存在提升,函数会被提升到作用域的最顶层,变量提升只是声明提升到作用域顶层
- var存在提升, 所以能在赋值之前获取;let、const因为暂时性死区,不能在声明前使用
- var声明的变量会挂靠给window,作为window的属性;let、const不会
- let、const作用基本一致,后者不能再次赋值。
let和const特性
- 作用域都是块级作用域
- 都有暂时性死区
- 都没有变量提升
- let不能重复声明变量,会报错;const声明常量且声明必须初始化
- let和const声明的全局变量将逐步与顶层对象的属性脱钩(与window的属性无关)。
- const只对比对象和数组的内存地址是否改变(如果需要申请常量对象和数组使用冻结对象或数组)
var a = 1; console.log(window.a); //1
let b = 2; console.log(window.b); //undefined
规范规定的原因:减少运行时错误,规范编码习惯,执行严格的编码规范;
暂时性死区:只要改let申明的区域都为let的死区,在其声明的前面使用的该变量都会报错;
(在声明完成之前使用变量都会报错,变量存在与获取时机不同,进入块级作用域变量就存在,只有声明完成后才能获取)
typeof x; // ReferenceError
let x;
typeof undeclared_variable // "undefined"
块级作用域:
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5,泄漏为全局变量
新增变量解构赋值
新增模板字符串
2. 新增数据类型
3.新增数据结构Map,Set
- Map
- 特征:
- 存储属性为任意类型的键值对的集合(键值对数组),区别于普通对象只能存储字符串或Symbol类型。
- 实例对象上有get,set,sjze方法来获取或设置键值,获取个数。
- 作用:组件复用
- 特征:
//用法
let map = Map([[a,1],[b,2]]);
console.log(map.get('a'));
map.set('c',3);
console.log(map.size) //3;
//将键值对数组map转换为对象
let map = new Map([['a','one'],['b','two'],['c','three']]); //希望得到{a:'one',b,'two',c:'three'}
let obj = Object.fromEntries(map); //Object.fromEntries是Object.entries的逆操作
- Set
- 特征:数组是存储可重复数据的集合,Set存储不可重复的集合
- 作用:数组去重,求交集、并集、
//数组去重
let arr = [1, 5, 8, 'ac', 1, 'ab', NaN, 5, 'ac', NaN]
let arr2 = Array.from(new Set(arr));
4.新增表达式
for…of
- 使用场景
- 只要实现了Iterator接口都可以使用for…of进行遍历
- 常见的集合数据结构,Array,Map都有[Symbol.Interator]标识,所以都可以使用for…of进行遍历。但是Object没有
for…of 与 for…in对比?
新增Api
对象api
数组api
新增面向对象class
新增异步操作
Promis
async await
generator
面试:ES6中用到了什么?
class:如果没有class基本上使用原型链实现继承,
Promise,异步的内容,EventLoop,proxy
let,var:变量提升
JS是如何运行的?
JS是单线程运行的,线程和进程,执行栈,EventLoop,微任务,宏任务,哪些是
浏览器/Node的EventLoop的区别。JS的垃圾回收