ES6面试题

1.let var const的区别

1.var具有变量提升机制,let 和 const 没有
2.var可以多次声明同一个变量,let 和 const不可以
3. var 和 let 声明的变量可以再次赋值,const不可以
4. var和let 可以不设置初始值,const必须设置初始值
5. var和let定义的数据可以修改,但是const定义的常量是基本数据类型,不能修改。定义的常量要是引用数据类型,就可以修改

2.解构赋值

变量的解构赋值:从数组和对象中提取,对变量进行赋值

1.数组的解构赋值: 数组的元素是按照次序排列的,变量的取值取决于他的位置
let [a,b,c]=[1,2,3]

2.对象的解构赋值: 对象的属性是没有次序的,变量必须于属性同名
let {foo, bar} = {foo:"aaa", bar:"bbb"}

3. 扩展运算符和剩余运算符

1. 扩展运算符spread(...):(右边)可以将一个数组转为逗号分隔的参数序列
2. 剩余运算符rest(...):(左边)把逗号分隔开的值序列组合成一个数组

 当三个点(…)在等号左边,或者放在形参上,为 rest 运算符
 当三个在等号右边,或者放在实参上,是 spread运算符
 应用:
 1.数组合并:[...arr1 , ...arr2 , ...arr3]
 
 2.与解构赋值结合,生产新数组
const [first, ...rest] = [1, 2, 3, 4, 5];
将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错

3.将字符串转为真正的数组
 let str=[...'hello'] //['h', 'e', 'l', 'l', 'o']
 
 4.将类数组转为真正的数组
 数组的扩展也可以使用:Array.from
 对象的扩展可以使用:Object.assign

4. 模板字符串

用反引号``标识,嵌入变量时,变量名写在${}中。
能使用回车换行,字符串拼接${age}

5.箭头函数

省区了function关键字,采用=>来定义函数
与普通函数的区别:
	从结构上来说,箭头函数更简洁
	箭头函数没有自己的this,它的this指向是在定义时所处的外层作用域下的this
	无法使用call\apply\bind改变this指向
	不能使用new关键字调用:因为箭头函数没有this,也没有prototype
	箭头函数没有自己的arguments对象

在调用函数时,浏览器每次都会传递进两个隐含的参数:
1.函数的上下文对象 this
2.封装实参的对象 arguments
arguments 代表的是实参。在调用函数时,我们所传递的实参都会在arguments 中保存

6.promise

1.作用:解决回调地狱问题,允许将回调函数嵌套改成链式调用

2.使用:
通过new Promise()的方法,创建一个Promise实例,Promise构造函数接收一个函数作为参数,这个函数有两个参数分别为reject和resolve;

resolve函数的作用:将Promise的状态从“未完成”变成“成功”(即从pending变为resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用:将Promise的状态从“未完成”变成“失败”(即从pending变为rejected),在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去;
3.状态:
promise有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败);
Promise状态改变只有两种可能:从pending变为fulfilled和从pending变为rejected;
而且一旦状态发生改变,就不会再变了。
4.方法:
原型上的方法:
	.then();接收两个回调函数作为参数
	catch():用于指定发生错误的回调函数
	finally():不管premise对象最后的状态如何都会执行
	
Promise自身的:all\race
	
	Promise.all([p1,p2,p3]):将多个promise实例包装成一个新的promise实例		
		只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled
		只要p1、p2、p3中有一个被rejected,p的状态就会变成rejected
		
	Promise.race([p1,p2,p3])
		只要p1、p2、p3中有一个实例率先改变状态,p的状态就会跟着改变,那个率先改变的Promise实例返回值,就传递给p的回调函数
		5.缺点
1.一旦建立立即执行,中途无法取消
2.如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
3.如果当前处于pending状态,无法得知目前进展到哪一个阶段

7.async+await的使用原理

作用:可以把异步操作同步执行,使异步编程更加简单、易于理解和维护
async函数执行时会返回一个Promise对象,可以使用.then()方法来处理成功和失败的回调函数。
await关键字只能在async函数中使用,用于等待异步操作完成,并返回结果。
原理:基于generator和Promise。当调用async函数时,生成一个Promise对象,
然后将函数中的代码封装在generator函数中执行;
当遇到await关键字,将异步操作封装成一个Promise;
然后通过.then方法获取异步操作的结果

8.Map

ES6的Map是一种新的数据结构,用于存储键值对。它有以下特点:

  1. 键可以是任何类型,包括对象和函数。
  2. 可以使用任何类型的数据作为值。
  3. 内置的迭代器可以遍历键值对。
  4. 可以通过size属性获取Map中键值对的数量。

Map对象的方法包括:

  1. set(key, value):向Map中添加一个键值对。
  2. get(key):获取指定键对应的值。
  3. has(key):判断Map中是否存在指定键。
  4. delete(key):删除指定键及其对应的值。
  5. clear():删除所有键值对。
  6. keys():返回一个包含Map中所有键的迭代器。
  7. values():返回一个包含Map中所有值的迭代器。
  8. entries():返回一个包含Map中所有键值对的迭代器。

Map的应用场景包括:

  1. 存储复杂的数据结构,如JSON。
  2. 缓存数据,可以利用键值对快速查找数据。
  3. 实现LRU(Least Recently Used)缓存淘汰算法。
  4. 存储动态生成的函数或类。

ES6中的Map是一种新的数据结构,它允许您将键值对存储在一个集合中,并且可以使用任何类型的值作为键(不仅限于字符串)。Map有许多内置的方法,可以用于添加,删除和查询元素。

1.创建Map

可以使用new关键字创建一个空的Map:

let myMap = new Map();

也可以通过传入带有键值对的数组来创建Map:

let myMap = new Map([[1, 'one'], [2, 'two'], [3, 'three']]);
  1. 添加和获取元素
    使用set()方法添加元素,使用get()方法获取元素:
myMap.set(4, 'four');
console.log(myMap.get(4));   // 输出: 'four'
  1. 删除元素
    使用delete()方法删除元素:
myMap.delete(4);
  1. 遍历Map
    可以使用forEach()方法或for…of循环来遍历Map:
myMap.forEach(function(value, key) {
    console.log(key + ' = ' + value);
});

for(let [key, value] of myMap) {
    console.log(key + ' = ' + value);
}

还可以使用keys()、values()和entries()方法分别获取Map中的键、值和键值对的迭代器。

  1. Map的大小
    使用size属性获取Map中的元素数量:
console.log(myMap.size);   // 输出: 3

9. Symbol

ES6引入了一种新的数据类型Symbol,它是一种原始类型,表示独一无二的值。Symbol的主要作用是为对象的属性添加一条隐藏的标识,防止同名属性的冲突。

Symbol的使用方法如下:

  1. 创建Symbol
const mySymbol = Symbol();
  1. 创建带描述的Symbol
const mySymbol = Symbol('my symbol');
  1. 在对象中使用Symbol
const mySymbol = Symbol('my symbol');

const myObj = {
  [mySymbol]: 'hello world'
};
console.log(myObj[mySymbol]); // 'hello world'
  1. 遍历Symbol属性
const mySymbol = Symbol('my symbol');
const myObj = {
  [mySymbol]: 'hello world'
};

for (let prop in myObj) {
  console.log(prop); // 不会输出mySymbol
}

console.log(Object.getOwnPropertySymbols(myObj)); // [Symbol(my symbol)]
  1. 使用Symbol作为常量
const MY_SYMBOL = Symbol('my symbol');

function foo() {
  const MY_SYMBOL = Symbol('my symbol');
  console.log(MY_SYMBOL === MY_SYMBOL); // false
}

console.log(MY_SYMBOL === MY_SYMBOL); // true

总的来说,Symbol的作用是为对象的属性添加一条隐藏的标识,防止同名属性的冲突。它可以帮助开发者更好地管理对象的属性,并且不影响原有对象的属性结构。

10.class

ES6中的class是一种声明式的语法糖,使得创建对象的代码更加简洁和易读。class关键字后面可以跟上类的名称,在类内部可以定义属性和方法。

用法:
	class Fn{
		//类的默认方法
		constructor(x,y){
			this.x=x;
			this.y=y
		}
		say(){}
	}
类的所有方法都定义在类的prototype属性上面
let fn=new Fn()

类的继承:
	class Zi extends Fn{
		constructor(x,y){
			super(x,y) //只有调用super之后,才能使用this关键字,否则会报错
				//super()只能用在子类的构造函数之中
			this.c=c;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值