JS面试知识点7-ES6

前言

ES6学习资料

规范规定的原因:减少运行时错误,规范编码习惯,执行严格的编码规范;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

  1. 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的逆操作
  1. 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的垃圾回收

猜你喜欢

转载自blog.csdn.net/weixin_43374360/article/details/114107997
今日推荐