https://juejin.cn/post/6844903734464495623
ES6面试
为什么选择 ES6 ?
- ES6是新一代的 JS 语言标准,规范了JS的使用标准(var标量提升)、新增了 JS 原生方法更加优雅
ES5、ES6、ES2015区别
- ES2015特指在2015年发布的新一代JS语言标准,ES6泛指下一代JS语言标准,包含ES2015、ES2016、ES2017、ES2018等。现阶段在绝大部分场景下,ES2015默认等同ES6。ES5泛指上一代语言标准。ES2015可以理解为ES5和ES6的时间分界线。
babel is what?
- babel是一个 ES6 转码器,可以将 ES6 代码转为 ES5 代码,以便兼容那些还没支持ES6的平台。
String字符串类型的升级优化
优化:
- 新增模板字符串,不需要再使用 + 拼接字符串,使用(
${}
)取代以往字符串形式,可以保存空格、换行符等
升级:
- 新增 includes 方法(以往只有indexOf、lastIndexOf查找字符位置)
- 新增 startWith()、endWith() padStart()、padEnd() repeat()
Array数组类型的升级优化
优化:
- 数组解构赋值
let [a,b,c] = [1,2,3]
形式进行赋值 - 扩展运算符 实现数组和松散序列的转化
let args = [...arguments]
,轻松实现数组结构复制
升级:
-
新增
find
,且修复[NaN].indexOf(NaN) === -1
的bug- 这里的修复指传 callback
arr.find(item => isNaN(item))
- 这里的修复指传 callback
-
copyWithin(target , start 【, end 默认length】)
,将数组 (s,end] 的内容复制到 target开始的地方,end为负数则就取start处的数据 -
includes()
:可以用来改写条件1 && 条件2 && 条件3
-
fill()
:new Array(10).fill(1)
-
flat()
:[1,2,[2,3]].flat()
,只能展开一层
Number数字类型的升级优化
优化:
- 更加严谨安全
-
Number.isNaN
:更为严格安全,isNaN()
会将字符串先往Number类型转换,再判断 -
Number.isFinite()
: Infinity、字符串、对象返回false
,全局isFinite()
同上 -
Number.isInteger(1.0) // true
,判断是否是整数
-
-
Math
:-
Math.cbrt(8) === 2
,计算立方根 -
Math.hypot(3:,4) === 25
,计算所有参数的平方的和的平方根 -
Math.sign()
:正数返回1,负数返回-1,非数字返回NaN -
Math.trunc()
:先转换为Number类型,正数、负数取整 / 非数字返回NaN
-
Number数字类型的升级优化
优化:
- 更加严谨安全
-
Number.isNaN
:更为严格安全,isNaN()
会将字符串先往Number类型转换,再判断 -
Number.isFinite()
: Infinity、字符串、对象返回false
,全局isFinite()
同上 -
Number.isInteger(1.0) // true
,判断是否是整数
-
-
Math
:-
Math.cbrt(8) === 2
,计算立方根 -
Math.hypot(3:,4) === 25
,计算所有参数的平方的和的平方根 -
Math.sign()
:正数返回1,负数返回-1,非数字返回NaN -
Math.trunc()
:先转换为Number类型,正数、负数取整 / 非数字返回NaN
-
Object类型的升级优化
优化:
- 对象属性变量式声明:
// 属性名与对应value的变量名相同时可缩写
let [apple, orange] = ['red appe', 'yellow orange'];
let myFruits = {apple, orange};
// let myFruits = {apple: 'red appe', orange: 'yellow orange'};
对象解构赋值
-
对象的扩展运算符(...)
:let {...obj} = {'a' : 1 , 'b' : 2}
-
super
关键字:同this总是指向当前函数所在的对象不同- super总是指向
当前函数所在对象的原型对象
- super总是指向
升级,ES6在Object原型上新增的方法
-
Object.is
:做两个目标对象的相等比较,修复NaN === NaN //false
,Object.is(NaN,NaN) // true
-
Object.assign(onlyTarget , source1 ,...)
:合并覆盖到onlyTarget
中- source中的
自身属性
会被合并 - source中的
继承属性
、不可枚举的属性
不会被合并- 且无法正确复制get和set属性(会直接执行get/set函数,取return的值)
- source中的
-
getOwnPropertyDescriptors(obj)
:获取对象所有的自身属性(配合defineProperties
使用),ES5中getOwnPropertyDescriptor(obj,属性名)
只能单个获取(配合defineProperty
使用)defineProperties( obj , {属性1 : {配置文件} , 属性2 :{配置文件} ... } )
defineProperty( obj , 属性名 , {配置文件} )
-
getPropertypeOf()
与setProperTypeOf()
:获取或设置当前对象的prototype对象-
__proto__
属性只是各大浏览器私加过于广泛而默许的属性- 在非浏览器环境不一定可以使用
-
-
keys() / values() / entries()
:分别获取对象键 / 值 / 键值对
的数组
Function函数类型
优化:
- 箭头函数:箭头函数内的
this 指向函数定义时所在的对象
,而不是函数执行时所在的对象
- 箭头函数如果外层仍是箭头函数,将继续向更外层寻找
- 箭头函数不能用作
构造函数
,因为没有自己的this,在new重定向this指向时,没有属于自己的this的可供绑定
- 箭头函数没有this,也不存在
arguments
对象,不过对象扩展符获取var fn = (...arguments)=>{console.log(arguments)} ; fn(1,2,3) // [1,2,3]
- 函数
默认赋值
,ES6之前无法通过形参给出默认赋值
升级部分
- ES6新增了
双冒号运算符
,用来取代bind、call和apply(浏览器暂不支持,Babel已经支持转码)
foo::bar;
// 等同于
bar.bind(foo);
foo::bar(...arguments);
// 等同于
bar.apply(foo, arguments);
Symbol是什么
- ES6引入的第7种基本数据类型,
Symbol()生成的值都是独一无二的
- 解决对象属性名太多导致的属性名冲突问题
-
Symbol作对象属性名
无法被for in
、for of
、Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
遍历到- Symbol() 不是对象的私有属性,
其它对象也可以使用它作属性
- Symbol() 不是对象的私有属性,
let a = Symbol('a');
let obj = {} ;
obj[a] = 'xxx';
// obj = {a : 'xxx'} 的属性名不是Symbol('a'),而是默认使用字符'a' 作属性名