this的指向
this的指向取决于所在的运行环境
全局环境:全局环境中的this指向全局对象,严格模式指向undefined,非严格模式指向global或者window
函数环境:函数环境中的this指向取决于函数是如何调用的
- 在严格模式下,函数中的this是undefined,非严格模式下指向全局对象
- 如果是对象调用的方法,则指向对象本身
- 如果是通过new 关键字,构造函数中的this,指向new出来的实例
- 如果是apply、call、bind调用,这些方式可以显示的绑定this,this指向传入的对象
- 箭头函数中的this继承自外部环境
- 在proxy的访问器属性中,receiver确保 this 指向 Proxy 实例,避免响应式系统失效
箭头函数
- 箭头函数不能用作构造函数,不能使用 new 关键字
- 箭头函数不能使用 apply、call、bind 来改变 this 的指向,因为箭头函数的 this 是固定的,继承自外部环境
- 箭头函数没有自己的 arguments 对象,如果需要访问参数,可以使用剩余参数(...args)
- 箭头函数没有 prototype 属性,因此不能用于定义类或原型方法
原型和原型链
原型
- 每个普通函数都有prototype属性,他是一个对象,你可以把 prototype 想象成一个“共享仓库”,里面存放着所有实例共用的属性和方法
- 当你使用这个函数创建实例的时,实例可以通过__proto__访问这个“共享仓库”
- 注意:箭头函数没有 prototype,因为它不能用来创建实例
原型链
- 当你访问一个对象的的属性和方法时,如果该对象没有,js会通过 proto 去他的prototype(共享仓库)里找
- 如果还没有,就会继续沿着上一级的prototype(共享仓库)里找,直到找到或者到达顶端null
- 这种一级一级向上查找的机制就是原型链
作用
- 节省内存:所有实例共用prototype(共享仓库中)中的属性和方法,无需每个对象都单独创建
- 实现继承:子类可以通过原型链继承父类的属性和方法
顶端
原型链的顶端是 Object.prototype,它的 proto 是 null
总结
- 原型是构造函数的 prototype 对象,用于存放共享成员;实例通过内部 [[Prototype]] 链式查找这些成员,形成原型链;链的终点是 Object.prototype.proto === null,这套机制实现了继承与内存优化
- 原型是共享属性和方法的地方,通过 prototype 属性实现
- 原型链是 JavaScript 实现继承的机制,通过 proto 属性实现
- 原型链的顶端是 Object.prototype,最终指向 null
- 原型链的核心作用是实现继承和节省内存,但需注意性能和修改原型的风险
Promise
Promise是ES6新出的一个对象,表示异步操作的结果,有三种状态:Pending(进行中)、Fulfilled(成功)和 Rejected(失败)。Pending状态一旦改变,不可逆转。
解决了什么问题
- Promise是处理异步任务的一种编写规范,可以用同步的表现形式来书写异步代码,解决了回调地狱的问题(避免了层层嵌套的回调函数),提升代码的可读性和可维护性
- 错误处理:catch方法可以使错误处理变得更加方便,避免了回调地域中错误处理逻辑分散导致的难以维护
特点
- 状态机:pending → fulfilled / rejected,一次性不可逆
- 链式:then/catch 返回新 Promise,解决回调地狱,错误一路冒泡
- 并发:all / race / any / allSettled 控制多个 Promise
- 异常处理:未捕获错误会触发 unhandledrejection,错误会静默丢失,需 catch 或全局监听
前端数据类型(8种)
JavaScript 基本(原始)数据类型共 7 种:
- Number
- String
- Boolean
- Undefined
- Null
- Symbol(ES6)
- BigInt(ES2020)
之外的所有值都属于 Object 类型(包括 Array、Function、Date 等)。
