• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-05-20 13:02 Aet 隐藏边栏 |   抢沙发  11 
文章评分 6 次,平均分 5.0

垃圾回收

  1. JavaScript 中主要的内存管理概念是 可达性
  2. 列出固有的可达值的基本集合,这些值明显不能被释放。这些值被称作 根(roots)
    1. 当前函数的局部变量和参数。
    2. 嵌套调用时,当前调用链上所有函数的变量与参数。
    3. 全局变量。
    4. (还有一些内部的)
  3. 如果一个值可以通过引用或引用链从根访问任何其他值,则认为该值是可达的。
  4. 在 JavaScript 引擎中有一个被称作 垃圾回收器 的东西在后台执行。它监控着所有对象的状态,并删除掉那些已经不可达的。

  1. 如果 user 的值被重写了,这个引用就没了

  1. 现在 这个对象变成不可达的了。因为没有引用了,就不能访问到它了。垃圾回收器会认为它是垃圾数据并进行回收,然后释放内存。

内部算法

  1. 垃圾回收的基本算法被称为 “mark-and-sweep”。
  2. 步骤
    1. 垃圾收集器找到所有的根,并“标记”(记住)它们。
    2. 然后它遍历并“标记”来自它们的所有引用。
    3. 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象。
    4. ……如此操作,直到所有可达的(从根部)引用都被访问到。
    5. 没有被标记的对象都会被删除。

this

  1. 为了访问该对象,方法中可以使用 this 关键字。

  1. javaScript 中的 this 可以用于任何函数,即使它不是对象的方法。this 的值是在代码运行时计算出来的,它取决于代码上下文。

  1. 箭头函数有些特别:它们没有自己的 this。如果我们在这样的函数中引用 thisthis 值取决于外部“正常的”函数。

构造函数

  1. 构造函数在技术上是常规函数。不过有两个约定:
    1. 它们的命名以大写字母开头。
    2. 它们只能由 "new" 操作符来执行。

构造模式测试:new.target

  1. 在一个函数内部,我们可以使用 new.target 属性来检查它是否被使用 new 进行调用了。

构造器的return

  1. 通常,构造器没有 return 语句。它们的任务是将所有必要的东西写入 this,并自动转换为结果。
  2. 但是,如果这有一个 return 语句,那么规则就简单了:
    1. 如果 return 返回的是一个对象,则返回这个对象,而不是 this
    2. 如果 return 返回的是一个原始类型,则忽略。
  3. 换句话说,带有对象的 return 返回该对象,在所有其他情况下返回 this

构造器中的方法

  1. 使用构造函数来创建对象会带来很大的灵活性。
  2. 构造函数可能有一些参数,这些参数定义了如何构造对象以及要放入什么。
  3. 我们不仅可以将属性添加到 this 中,还可以添加方法。

可选链"?."

  1. 可选链 ?. 是一种访问嵌套对象属性的安全的方式。即使中间的属性不存在,也不会出现错误。

  1. 用于函数调用

"不存在的属性"

  1. value?.prop
    1. 如果 value 存在,则结果与 value.prop 相同
    2. 否则(当 valueundefined/null 时)则返回 undefined
  2. 如果 ?. 左边部分不存在,就会立即停止运算(“短路效应”)

  1. 其他变体

Symbol类型

  1. 根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。
  2. “Symbol” 值表示唯一的标识符。

  1. 创建时,我们可以给 Symbol 一个描述(也称为 Symbol 名),这在代码调试时非常有用:

  1. Symbol 保证是唯一的。即使我们创建了许多具有相同描述的 Symbol,它们的值也是不同。描述只是一个标签,不影响任何东西。

  1. 注意
    1. JavaScript 中的大多数值都支持字符串的隐式转换。但Symbol 不会被自动转换为字符串

"隐藏"属性

  1. Symbol 允许我们创建对象的“隐藏”属性,代码的任何其他部分都不能意外访问或重写这些属性。

  1. 对象字面量中的Symbol

  1. Symbol 属性不参与 for..in 循环。

全局Symbol

  1. 但有时我们想要名字相同的 Symbol 具有相同的实体。为了实现这一点,这里有一个 全局 Symbol 注册表
  2. 我们可以在其中创建 Symbol 并在稍后访问它们,它可以确保每次访问相同名字的 Symbol 时,返回的都是相同的 Symbol。
  3. 要从注册表中读取(不存在则创建)Symbol,请使用 Symbol.for(key)
  4. 该调用会检查全局注册表,如果有一个描述为 key 的 Symbol,则返回该 Symbol,否则将创建一个新 Symbol(Symbol(key)),并通过给定的 key 将其存储在注册表中。

  1. Symbol.keyFor:对于全局 Symbol,不仅有 Symbol.for(key) 按名字返回一个 Symbol,还有一个反向调用:Symbol.keyFor(sym),它的作用完全反过来:通过全局 Symbol 返回一个名字。

系统Symbol

  1. JavaScript 内部有很多“系统” Symbol,我们可以使用它们来微调对象的各个方面。
  2. Symbol.hasInstance
  3. Symbol.isConcatSpreadable
  4. Symbol.iterator
  5. Symbol.toPrimitive
  6. ……等等。

对象-原始值转换

  1. 所有的对象在布尔上下文(context)中均为 true。所以对于对象,不存在 to-boolean 转换,只有字符串和数值转换。
  2. 数值转换发生在对象相减或应用数学函数时。
  3. 至于字符串转换 —— 通常发生在我们像 alert(obj) 这样输出一个对象和类似的上下文中。
  4. ToPrimitive
  5. string

  1. number

  1. default

Symbol.toPrimitive

  1. 有一个名为 Symbol.toPrimitive 的内建 symbol,它被用来给转换方法命名

toString/valueOf

  1. 方法 toStringvalueOf 来自上古时代。
  2. toString 方法返回一个字符串 "[object Object]"
  3. valueOf 方法返回对象自身。

返回类型

  1. 关于所有原始转换方法,有一个重要的点需要知道,就是它们不一定会返回 “hint” 的原始值。
  2. 没有限制 toString() 是否返回字符串,或 Symbol.toPrimitive 方法是否为 hint “number” 返回数字。
  3. 唯一强制性的事情是:这些方法必须返回一个原始值,而不是对象。

进一步转换

  1. 如果我们将对象作为参数传递,则会出现两个阶段:
    1. 对象被转换为原始值(通过前面我们描述的规则)。
    2. 如果生成的原始值的类型不正确,则继续进行转换。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-05-14
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享