Appearance
ES6 问题汇总
https://github.com/pwstrick/daily/blob/master/interview/es6.md
1. let 与 const 两个关键字与 var 的不同
- let 和 const 可以定义在块级作用域,var不行
- 都有变量提升,但是 var 可以提前访问(undefined) , let 与 const 会暂时性死区,报错
- let 和 const 不允许重复声明,var 可以
- 顶级作用域声明的变量, var 会挂载到 window, let 与 const 不会
2. 请说明一下const的特点
- 声明的值,基本类型不能更改,引用类型不允许改引用,可以改属性
- 块级作用域
3. 扩展运算符用途
- 获取函数的参数,给函数传参
- 浅拷贝
- 合并对象,合并数组
- 用于解构赋值
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 的模块化,导入的是变量的引用,
限制:
- 兼容问题
- 静态加载,模块导入只能放在文件头部
- 命名冲突