Skip to content

this的指向

this的指向取决于所在的运行环境

  • 全局环境:全局环境中的this指向全局对象,严格模式指向undefined,非严格模式指向global或者window

  • 函数环境:函数环境中的this指向取决于函数是如何调用的

    1. 在严格模式下,函数中的this是undefined,非严格模式下指向全局对象
    2. 如果是对象调用的方法,则指向对象本身
    3. 如果是通过new 关键字,构造函数中的this,指向new出来的实例
    4. 如果是apply、call、bind调用,这些方式可以显示的绑定this,this指向传入的对象
    5. 箭头函数中的this继承自外部环境
    6. 在proxy的访问器属性中,receiver确保 this 指向 Proxy 实例,避免响应式系统失效

箭头函数

  • 箭头函数不能用作构造函数,不能使用 new 关键字
  • 箭头函数不能使用 apply、call、bind 来改变 this 的指向,因为箭头函数的 this 是固定的,继承自外部环境
  • 箭头函数没有自己的 arguments 对象,如果需要访问参数,可以使用剩余参数(...args)
  • 箭头函数没有 prototype 属性,因此不能用于定义类或原型方法

原型和原型链

原型

  1. 每个普通函数都有prototype属性,他是一个对象,你可以把 prototype 想象成一个“共享仓库”,里面存放着所有实例共用的属性和方法
  2. 当你使用这个函数创建实例的时,实例可以通过__proto__访问这个“共享仓库”
  3. 注意:箭头函数没有 prototype,因为它不能用来创建实例

原型链

  1. 当你访问一个对象的的属性和方法时,如果该对象没有,js会通过 proto 去他的prototype(共享仓库)里找
  2. 如果还没有,就会继续沿着上一级的prototype(共享仓库)里找,直到找到或者到达顶端null
  3. 这种一级一级向上查找的机制就是原型链

作用

  1. 节省内存:所有实例共用prototype(共享仓库中)中的属性和方法,无需每个对象都单独创建
  2. 实现继承:子类可以通过原型链继承父类的属性和方法

顶端

原型链的顶端是 Object.prototype,它的 proto 是 null

总结

  • 原型是构造函数的 prototype 对象,用于存放共享成员;实例通过内部 [[Prototype]] 链式查找这些成员,形成原型链;链的终点是 Object.prototype.proto === null,这套机制实现了继承与内存优化
  • 原型是共享属性和方法的地方,通过 prototype 属性实现
  • 原型链是 JavaScript 实现继承的机制,通过 proto 属性实现
  • 原型链的顶端是 Object.prototype,最终指向 null
  • 原型链的核心作用是实现继承和节省内存,但需注意性能和修改原型的风险

Promise

Promise是ES6新出的一个对象,表示异步操作的结果,有三种状态:Pending(进行中)、Fulfilled(成功)和 Rejected(失败)。Pending状态一旦改变,不可逆转。

解决了什么问题

  1. Promise是处理异步任务的一种编写规范,可以用同步的表现形式来书写异步代码,解决了回调地狱的问题(避免了层层嵌套的回调函数),提升代码的可读性和可维护性
  2. 错误处理:catch方法可以使错误处理变得更加方便,避免了回调地域中错误处理逻辑分散导致的难以维护

特点

  1. 状态机:pending → fulfilled / rejected,一次性不可逆
  2. 链式:then/catch 返回新 Promise,解决回调地狱,错误一路冒泡
  3. 并发:all / race / any / allSettled 控制多个 Promise
  4. 异常处理:未捕获错误会触发 unhandledrejection,错误会静默丢失,需 catch 或全局监听

前端数据类型(8种)

JavaScript 基本(原始)数据类型共 7 种:

  1. Number
  2. String
  3. Boolean
  4. Undefined
  5. Null
  6. Symbol(ES6)
  7. BigInt(ES2020)

之外的所有值都属于 Object 类型(包括 Array、Function、Date 等)。

Released under the MIT License.