前端面试——ES6篇

513 阅读3分钟

let const

  • let:1.块级作用域;2.不能同一作用域重复声明;3.没有变量提升
  • const: 1.申明后不能改变其值;2.可以改变对象下面的属性值,但不能改变对象;
  • 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。js对象是存的地址
var a = {name:2}; // a得到的是对象{name:2}的存储地址
var b = a; //b也是对象{name:2}的存储地址
b.name = 3;
console.log(a);//3
  1. a,b实际上都是指向一个相同对象的内存地址;
  2. 即a,b都是对同一内存地址的引用;
  3. 所以a变b就变,b变a就变。

变量的解构赋值

  1. 优点:使代码更加简洁,明了
  2. 解构
const obj = {name:'jack',age:21}
const {type='',name,age:useAge} = obj;
// 等价写es5
var type = obj.type || '';//默认值
var name = obj.name;
var useAge = obj.age; 重新取名
  1. 赋值
const obj = {name:'jack',age:21}
const {type='',name,age:useAge} = obj;
const obj2 = {type,name,useAge};
// 等价于es5
var obj2 = {type:type,name:name,useAge:useAge};

箭头函数

() => {}

  1. 使代码更加简洁,明了;
  2. 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
  3. 不可以当作构造函数;没有arguments;

数组

  1. 扩展运算符
console.log(...[1, 2, 3])
// 1 2 3

console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
  1. Array.of方法用于将一组值,转换为数组。
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
  1. 数组实例的 find() 和 findIndex()
  • 接受一个函数
[1, 4, -5, 10].find((n) => n < 0);// -5
  1. 数组实例的 includes()
[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true
  1. 数组实例的 flat(),flatMap()
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]] 
//默认1;

[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
//如果不管有多少层嵌套,都要转成一维数组

flatMap() ,相当于执行一次数组的map()后再执行flat()

// map方法
[,'a'].map(x => 1) // [,1];
// filter方法
['a',,'b'].filter(x => true) // ['a','b']
// reduce方法,可以了解一下,react里面的reduce灵感应该来自这里
[1,,2].reduce((x,y) => x+y) // 3

Set 和 Map 数据结构

Set本身是一个构造函数,用来生成 Set 数据结构。

1. set 去重数组

// 例一
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]

// 例二
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5

// 例三
const set = new Set(document.querySelectorAll('div'));
set.size // 56

// 去除数组的重复成员
[...new Set(array)]

2. WeakSet

结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。

  • WeakSet 的成员只能是对象,而不能是其他类型的值。
  • WeakSet 中的对象都是弱引用(即垃圾回收机制不考虑 WeakSet 对该对象的引用,这样可以防止内存泄漏)

补充:垃圾回收机制是计数规则,就是有一个对象的内存地址被引用一次,就计数一次,如何没有被引用了就会被垃圾回收机制自动回收。比如

// user 具有对象的引用
let user = {
  name: "John"
};
user = null;
//就被释放了

Map 数据结构

主要就是可以用obj当键值

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

WeakMap

  1. WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
  2. 同理,弱引用的Map

async 函数

  1. 异步函数同步写法,提高代码可读性;
  2. async函数返回一个 Promise 对象。

注:参考阮一峰的es6