1.如果 new 一个箭头函数会怎么样?
回答重点
会报错,因为箭头函数设计上并不具备构造函数的特性,没有自己的this 对象,没有 prototype 属性,所以 new 一个箭头函数会报错。
扩展知识
-
报错:会抛出一个 TypeError
· let fun =()=>{console.1og("是一个箭头函数”)};
· new fun();
// TypeError: fun is not a constructor
- 当我们 new 一个构造函数后:
1.会创建一个新的对象
2.将函数的作用域赋给新对象,也就是将对象的_proto_属性指向 prototype 属性
3.将新建的对象设置给函数中 this
4.如果函数没有返回对象则返回 this
通过上述步骤可知:第 2,3步,头函数都无法执行。 总结: 因为箭头函数没有 prototype 属性,且箭头函数的 this 的指向在它被定义的时候就已经确定了且不会改变,所以无法 new 一个箭头函数。
2 .ES6 箭头函数的 this 指向哪里?
ES6 箭头函数的 this 指向定义它时所处上下文的对象的 this。 箭头函数的 this 指向是固定的,在函数定义时就确定了,之后不会再改变。
扩展知识
箭头函数和普通函数不同,普通函数的 this 是在调用时决定的,。
1)箭头函数的 this 绑定:
箭头函数没有自己的 this 值,它会捕获上下文中的 this 作为自己的 this。无论箭头函数是如何调用的,它的 this 始终保持不变。
2)普通函数的 this 绑定:
普通函数的 this 是动态的,取决于函数的调用方式。它可能指向全局对象、调用它的对象或显式绑定的对象(通过 call、apply、bind)。
function Outer(){
this.name = 'outer';
//普通函数
function InnerFunc()fconsole.log(this.name);//这里的this、取决于InnerFunc 的调用方式
J
// 箭头函数
const InnerArrow=()=>{console.log(this.name);//这里的this、始终指向 0uter的实例
J;
this.innerFunc = InnerFunc;
this.innerArrow = InnerArrow;
const obj= new Outer();
obj.innerFunc();//“0uter”:指向全局对象的`name`(在非严格模式下);undefined:(在严格模式下)
obj.innerArrow();//“Outer"
3)箭头函数在处理回调函数时特别有用,因为它避免了常见的 this 绑定问题。
function Timer(){
this.seconds =0;
setInterval(()=>{this.seconds++;console.log(this.seconds);//这里的this、始终指向 Timer 的实例},1000);
const timer =new Timer();
总结: 箭头函数的 this 在定义时就被绑定到它所在的上下文,而不是在调用时决定。这使得節头函数在处理嵌套回调函数时特别有用,避免了复杂的 this 绑定问题
3. 什么是 ES6 的数组解构和对象解构?
ES6引入了数组解构和对象解构语法,这些功能让我们能够直接从数组或对象中提取值并赋予变量,从而减少代码冗长度和提升可读性。数组解构允许你技顺序获取数组中的元素,而对象解构让你可以直接获取对象中的属性值。
1.数组解构:通过类似数组的语法来分配数组中的元素到变量中。
const[a,b,c]=[1,2,3];
console.log(a);// 输出1
console.log(b);//翰出 2
console.log(c);//输出 3
2.对象解构:通过类似对象的语法来分配对象中的属性值到变量中。
const user ={name:'Alice', age: 25 };
const {name, age }=user;
console.log(name);//输出'Alice
console.log(age);// 输出 25
更复杂的解构 解构不仅限于简单的一层,还可以处理更复杂的场景,譬如嵌套解构和默认值:
const person =
name:'Bob'
address:{
city:'New York'
zip:'10001'
}
const{name,address:{city,zip}}=person;
console.log(city);
//输出'New Yorkconsole.log(zip);
//输出'10001'
2.默认值:
const[x=10,y=5]=[undefined];console.log(x);//输出 10console.log(y);//输出5
const{a=3,b=4}={a: undefined};
console.log(a);//输出 3
console.log(b);//输出 4
Promise是高阶函数
const myPromise = new Promise((resolve, reject) => {}
在前端开发中,Promise是一种用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。以下是对Promise的详细介绍:
基本概念
-
Promise有三种状态:- Pending(进行中) :初始状态,既不是成功,也不是失败状态。表示异步操作正在进行中,还没有得出结果。
- Fulfilled(已成功) :意味着异步操作成功完成,并且可以通过
Promise对象获取到操作的结果值。 - Rejected(已失败) :表示异步操作失败了,通常会携带一个原因,用于说明失败的原因。
-
一旦
Promise从Pending状态转变为Fulfilled或Rejected状态,就称为 “已解决(settled)”,状态就不会再发生变化。
主要作用
- 解决回调地狱:在传统的异步编程中,多个异步操作嵌套时会出现回调函数层层嵌套的情况,这被称为 “回调地狱”,会导致代码难以阅读和维护。
Promise通过链式调用的方式来处理异步操作,使代码更加清晰和易于理解。 - 异步操作的管理和组合:可以方便地对多个异步操作进行管理和组合,比如并行执行多个异步操作,然后在所有操作都完成后执行一些逻辑,或者按照顺序依次执行多个异步操作等。
基本用法
-
创建一个
Promise实例,需要传入一个执行器函数,该函数接受两个参数,分别是resolve和reject函数。resolve函数用于将Promise状态从Pending变为Fulfilled,并传递成功的值;reject函数用于将状态变为Rejected,并传递失败的原因。示例如下:
const myPromise = new Promise((resolve, reject) => {
// 模拟一个异步操作,比如延迟1秒后返回结果
setTimeout(() => {
const randomNumber = Math.random();
if (randomNumber > 0.5) {
resolve('操作成功,随机数大于0.5');
} else {
reject('操作失败,随机数小于等于0.5');
}
}, 1000);
});
- 可以使用
then方法来处理Promise成功和失败的情况,then方法接受两个回调函数,第一个回调函数在Promise成功时调用,第二个回调函数在Promise失败时调用。示例如下:
4. JS 常见的报错
- JS 的 error 处理
1.3.1. 错误的类型
-
Error: 所有错误的父类型
-
ReferenceError: 引用的变量不存在
-
TypeError: 数据类型不正确的错误
-
RangeError: 数据值不在其所允许的范围内
-
SyntaxError: 语法错误
1.3.2. 错误处理
-
捕获错误: try ... catch
-
抛出错误: throw error