ES6 面试要点攻克

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))
  • 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总是指向当前函数所在对象的原型对象

升级,ES6在Object原型上新增的方法

  • Object.is:做两个目标对象的相等比较,修复NaN === NaN //falseObject.is(NaN,NaN) // true
  • Object.assign(onlyTarget , source1 ,...):合并覆盖到onlyTarget
    • source中的自身属性会被合并
    • source中的继承属性不可枚举的属性不会被合并
      • 且无法正确复制get和set属性(会直接执行get/set函数,取return的值)
  • 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 infor ofObject.keys()Object.getOwnPropertyNames()JSON.stringify()遍历到
      • Symbol() 不是对象的私有属性,其它对象也可以使用它作属性
let a = Symbol('a');
let obj = {} ;
obj[a] = 'xxx';
// obj = {a : 'xxx'} 的属性名不是Symbol('a'),而是默认使用字符'a' 作属性名
上一篇:小猪猪的matlab学习笔记


下一篇:=== 和 == 的区别 ?