Skip to content
On this page

ES6 问题汇总

https://github.com/pwstrick/daily/blob/master/interview/es6.md

1. let 与 const 两个关键字与 var 的不同

  1. let 和 const 可以定义在块级作用域,var不行
  2. 都有变量提升,但是 var 可以提前访问(undefined) , let 与 const 会暂时性死区,报错
  3. let 和 const 不允许重复声明,var 可以
  4. 顶级作用域声明的变量, var 会挂载到 window, let 与 const 不会

2. 请说明一下const的特点

  1. 声明的值,基本类型不能更改,引用类型不允许改引用,可以改属性
  2. 块级作用域

3. 扩展运算符用途

  1. 获取函数的参数,给函数传参
  2. 浅拷贝
  3. 合并对象,合并数组
  4. 用于解构赋值

4. 什么是解构

从数组或者对象中获取属性值,并赋值给变量

js
const [a,b] = [1,2] // a 1, b 2
const {a,b} = {a:1,b:2} // a 1, b 2
const {a: a1,b: b2, c:c3 = 4} = {a:1,b:2}  // a1 1, a2 2 ,c3 4

5. 如果忽略声明关键字,那么在运行对象解构的时候,为何要用圆括号包裹赋值表达式(如下所示)?

js
({ a, b } = { a: 3, b: 4 });

使用括号可以对表达式求值,上述的语句会得到 {a:3,b:4}, 不加括号的话 会产生语法错误,无法直接对 {}赋值

6. 利用数组解构交换变量

js
let a = 1
let b = 2
[a,b] = [b, a]

7. 解构实践题

[,,z] = [1,2,3] // z = 3
[x,...y] = [1,2,3] //x = 1, y = [2,3] , 利用扩展符解构得到数组
{a:e,a:f}= {b: 4,a:6} // e = 6, f = 6 , 允许对同个值解构重命名
{a,b=2} = {a:1,b:null} // b=nul ,默认值在值为undefined时 才起作用

8.模板字面量

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Template_literals

定义:es6 引入的定义字符串的语法,可以在内部使用变量,可以直接声明换行的字符串,允许嵌套,模板字面量也可以调用函数

限制: es2016 以及之前版本,

  • Unicode 字符以"\u"开头,例如\u00A9
  • Unicode 码位用"\u{}"表示,例如\u
  • 十六进制以"\x"开头,例如\xA9
  • 八进制以""和数字开头,例如\251

以上包含转义字符的会报错, es2018 后,带标签的模板字面量(函数调用)会进行兼容,转化为 undefined, 普通模板字面量对于某些转义字符还是会报错

9. ES6 是否扩展了对象字面量中的属性名

es6 中对象字面量的属性名可以用 变量和表达式, 利用 [] 进行包裹,内部的值会转化为字符串

10. Symbol 的理解

Symbol 是ES 新增的基础数据类型,具有唯一性,不可通过 new 调用,只能函数直接调用生成

js
const a = Symbol()
const b = Symbol('b')

Symbol 属于内建对象,可以直接调用自身的方法。

对象内部实现 Symbol.iterator方法,可以进行迭代器遍历for ... of

可以利用Symbol 创建私有属性

11. 如何理解内置符号

算术符号:+、-、*、/、%、++、--

比较符号:==、!=、===、!==、<、>、<=、>=

逻辑符号:&&、||、!

位运算符号:&、|、^、~、<<、>>

赋值符号:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

条件运算符:?:

函数调用符号:()

对象属性符号:.

数组索引符号:[]

扩展运算符:...

类型运算符:typeof、instanceof

其他符号:,、;、:、\、/、'、"、`、#、$、@、!、?、{}、()、[]

12. [...[..."..."]].length

3, 首先内部使用扩展运算符将字符串转化为长度为3的数组,然后再进行扩展,最后长度为3

13. 模块化

js
export const a = 1
export function b() {}
export default a  // 默认导出变量
export default function b() {} // 默认导出函数

import {a,b} from ''  // 具名导入
import b from ''  // 默认导入

import {default as a} from '' // 具名导入默认 

ES Module 的模块化,导入的是变量的引用,

限制:

  1. 兼容问题
  2. 静态加载,模块导入只能放在文件头部
  3. 命名冲突

使用 Vitepress 强力构建