前端面试:ES6 基础知识点 & ES6 相关面试题_function f1(letn=5 if(true){let n=10})

ECMAScript 6.0(简称ES6)是 JavaScript 语言的下一代标准。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

在这里插入图片描述

let const

在es6之前,定义变量都是使用var,但是var存在一些问题,比如可以重复声明,仅支持函数作用域问题。所以es6设计了let和const来弥补不足的地方。let和const具备哪些特性?

let

  • 不能重复声明
  • 块级作用域
  • 可修改let变量的值

const

  • 不可重复声明
  • 块级作用域
  • 不可修改const变量的值

块级作用域

es5只有全局作用域和函数作用域,没有块级作用域:

var temp = new Date();

function f() {
  console.log(temp);
  if (false) {
    var tmp = "hello world";
  }
}

f(); // undefined

  • es6的块级作用域:
function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

// IIFE 写法
(function () {
  var temp = ...;
  ...
}());

// 块级作用域写法
{
  let temp = ...;
  ...
}

  • es6中引入了块级作用域,明确允许在块级作用域之中声明函数
// ES6严格模式
'use strict';
if (true) {
  function f() {}
}
// 不报错

  • es6的块级作用域声明函数只在使用大括号的情况下成立
// 不报错
'use strict';
if (true) {
  function f() {}
}

// 报错
'use strict';
if (true)
  function f() {}

扩展运算符:

将一个数组转化为逗号分隔的参数序列

console.log(...[1, 2, 3])               
// 1 2 3

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

[...document.querySelectorAll('div')]   
// [<div>, <div>, <div>]

{...{a: 1}, ...{a: 2, b: 3}}            
// {a: 2, b: 3}

[...[1], ...[2, 3]]                     
// [1, 2, 3]

const arr = [1]
arr.push(...[2, 3])                     
// arr:[1, 2, 3

默认参数:

function log(x, y = 'World') {
    console.log(x, y)
}

log('Hello')             
// Hello World

log('Hello', undefined)  
// Hello World

log('Hello', 'China')    
// Hello China

log(undefined, 'China')  
// undefined China

log(, 'China')           
// 报错 SyntaxError

log('Hello', '')         
// Hello

log('Hello', null)       
// Hello null

参数不传递或是传递undefined会让参数等于默认值,如果参数不是最后一个,不传递参数就会报错。

传递null不会让函数参数等于默认值。

// 获取函数所有的参数,rest 为数组
function func1(...rest){ /\* ... \*/}

// 获取函数第一个参数外其他的参数,rest 为数组
function func1(val, ...rest){ /\* ... \*/}

模板字符串:

var str = `abcdefgh`;
console.log(str);
let name = "小明";
function a() {
    return "ming";
}
console.log(`我的名字叫做${name},年龄${17+2}岁,性别${'男'},游戏ID:${a()}`);

函数的默认参数:

function A(a,b=1){
    console.log(a+b);
}
A(1);    //2
A(2+3);  //5

箭头函数:

//省略写法
var people = name => 'hello' + name;
 
var getFullName = (firstName, lastName) => {
    var fullName = firstName + lastName;
    return fullName;
}

对象的扩展:

var foo = 'bar';
var baz = {foo};  
//等同于 var baz = {foo: foo};

var o = {
  method() {
    return "Hello!";
  }
};
 
// 等同于
var o = {
  method: function() {
    return "Hello!";
  }
};

set数据结构

  • size 数据的长度
  • add() 添加某个值,返回 Set 结构本身。
  • delete() 删除某个值,返回一个布尔值,表示删除是否成功。
  • has() 查找某条数据,返回一个布尔值。
  • clear() 清除所有成员,没有返回值。

Promise对象

它有三种状态,分别是pending-进行中、resolved-已完成、rejected-已失败。

var promise = new Promise((resolve, reject) => {
    var success = true;
    if (success) {
        resolve('成功');
    } else {
        reject('失败');
    }
}).then(
    (data) => { console.log(data)},
    (data) => { console.log(data)}
)

async / await

async其实就是对Generator的封装,只不过async可以自动执行next()。

async function read () {
    let data1= await new Promise(resolve => {
        resolve('100')
    })
    let data2 = await 200
    
    return 300
}

(1)async 返回值

async 默认返回一个 Promise,如果 return 不是一个 Promise 对象,就会被转为立即 resolve 的 Promise,可以在 then 函数中获取返回值。

async 必须等到里面所有的 await 执行完,async 才开始 return,返回的 Promise状态才改变。除非遇到 return 和错误。

async function fn () {
    await 100
    await 200
    return 300
}
fn().then(res => {
    console.log9(res) // 300
})

(2)await

await 也是默认返回 Promise 对象,如果 await 后面不是一个 Promise 对象,就会转为立即 resolve 的 Promise

如果一个 await 后面的 Promise 如果为 reject,那么整个 async 都会中断执行,后面的awiat都不会执行,并且抛出错误,可以在 async的catch中捕获错误

async function f() {
  await Promise.reject('error');
  await Promise.resolve('hello world'); // 不会执行
}
f().then(res =>{

}).catch(err=>{
    console.log(err)  // error
})

如果希望一个await失败,后面的继续执行,可以使用try…catch或者在await后面的Promise跟一个catch方法:

// try...catch
async function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))   // hello world

// catch
async function f() {
  await Promise.reject('出错了')
    .catch(e => console.log(e));   // 出错了
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))  // hello world

箭头函数

箭头函数在写法上对es5做了一些修整,代码看起来更显得简洁

  • 如果只有一个参数,圆括号 “()” 可以省略
  • 函数体如果只有一句 return 语句,花括号也可以省略

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值