JavaScript 弱引用强引用底层示例详解

yizhihongxing

JavaScript 弱引用和强引用底层示例详解

什么是引用

在 JavaScript 中,引用是指对内存中存储的对象的指针。当创建一个对象时,JavaScript 会为其在内存中分配一块区域,并返回一个引用,用于在程序执行时访问该对象。在 JavaScript 中,所有变量都是通过引用来存储和访问的,因此引用是非常重要的概念。

弱引用和强引用

在 JavaScript 中,为了确保内存不会被无限占用,需要自动清理不再使用的对象。这就需要对引用的类型进行区分,通常可以分为弱引用和强引用。

弱引用

弱引用是指当对象所持有的所有强引用都被释放后,该对象就会被自动回收。所以弱引用通常用于缓存、垃圾回收和对象绑定等场景。

在 JavaScript 中,可以通过以下两种方式来创建弱引用:

WeakMap

WeakMap 是 JavaScript 中的一个特殊对象,用于存储键值对。WeakMap 和 Map 类似,当键值对的键被释放时,值也会被自动删除。

以下是使用 WeakMap 创建弱引用的示例:

const wm = new WeakMap()
const obj1 = {}
const obj2 = {}
wm.set(obj1, 'hello')
wm.set(obj2, 'world')
console.log(wm.get(obj1)) // 'hello'
console.log(wm.get(obj2)) // 'world'
obj1 = null
console.log(wm.get(obj1)) // undefined

WeakSet

WeakSet 是 JavaScript 中用于存储一组值的集合,它们可以是任意类型的值。当一个值被释放时,它会被自动从集合中删除。

以下是使用 WeakSet 创建弱引用的示例:

const ws = new WeakSet()
const obj1 = {}
const obj2 = {}
ws.add(obj1)
ws.add(obj2)
console.log(ws.has(obj1)) // true
console.log(ws.has(obj2)) // true
obj1 = null
console.log(ws.has(obj1)) // false

强引用

强引用是指当对象被一个或多个强引用所引用时,该对象会一直存在于内存中,不会被自动回收。

在 JavaScript 中,常用的为强引用的场景是:对象作为一个方法的参数或返回值传递时,或者对象绑定到了全局变量上。

以下是使用常规方式创建强引用的示例:

const obj1 = {}
const obj2 = {}
const obj3 = obj1
console.log(obj1 === obj3) // true
obj3 = obj2
console.log(obj1 === obj3) // false

示例

以下为2个示例分别使用了弱引用和强引用:

示例1:WeakMap 实现缓存

WeakMap 可以非常方便地实现缓存功能,当缓存中的对象不再被引用时,就会自动清理。

class Cache {
  constructor() {
    this._cache = new WeakMap()
  }

  getItem(key) {
    return this._cache.get(key)
  }

  setItem(key, value) {
    this._cache.set(key, value)
  }

  deleteItem(key) {
    this._cache.delete(key)
  }
}

const cache = new Cache()
const obj = {}
cache.setItem(obj, 'hello')
console.log(cache.getItem(obj)) // 'hello'
obj = null
console.log(cache.getItem(obj)) // undefined

示例2:强引用绑定全局变量

强引用通常用于保持对象的生命周期和可访问性。

// 将对象绑定到全局变量上
const obj = {}
window.obj = obj

// 从全局变量中删除对象
delete window.obj

// 观察对象是否被回收
let count = 0
const interval = setInterval(() => {
  if (count > 10) {
    clearInterval(interval)
    console.log('清理完成')
  } else {
    console.log('对象已释放' + (window.obj === undefined))
    count++
  }
}, 500)

在以上示例中,我们将一个对象绑定到了全局变量 window 上,并通过 delete 运算符删除该对象。然后,通过 setInterval 方法,在短时间内进行多次判断,以观察该对象的生命周期。

总结

弱引用和强引用都是 JavaScript 中的重要概念,它们可以帮助我们更好地控制内存的使用和回收。在实际编程中,需要根据具体情况灵活选择不同类型的引用,以适应不同的需求和场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 弱引用强引用底层示例详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • vue 虚拟DOM快速入门

    下面提供一份“Vue虚拟DOM快速入门”的攻略,包括概念解析、基本使用、示例说明等。希望对你有所帮助。 Vue虚拟DOM快速入门 什么是虚拟DOM 虚拟DOM是将DOM抽象出来,以Javascript对象的形式模拟整个页面的DOM结构。Vue中的虚拟DOM和其他框架(如React)中的实现大同小异。 虚拟DOM的核心思想是通过比较前后两个虚拟DOM的差异,然…

    JavaScript 2023年6月11日
    00
  • 一篇文章弄懂js中的typeof用法

    一篇文章弄懂 JS 中的 typeof 用法 typeof 是 JavaScript 中的一个关键字,用于确定一个值的数据类型。如今,在 JavaScript 中,由于一些语言习惯的原因,被称为“类型”或“类型操作符”。了解 typeof 的使用方法对于学习和理解 JavaScript 语言非常重要。 使用 typeof 的基本语法 语法:typeof op…

    JavaScript 2023年6月11日
    00
  • JavaScript Event学习第三章 早期的事件处理程序

    下面是JavaScript Event学习第三章 早期的事件处理程序的完整攻略: 1. 什么是早期的事件处理程序 在早期的浏览器中,事件处理程序是通过在HTML标签中添加属性来实现的。例如,要在一个按钮上添加一个点击事件的处理程序,可以写成如下的HTML代码: <button onclick="handleButtonClick()&quot…

    JavaScript 2023年5月27日
    00
  • asp.net中使用cookie传递参数的方法

    针对“asp.net中使用cookie传递参数的方法”,我将分为以下几个部分进行说明: 什么是cookie? 如何创建cookie? 如何读取cookie? 如何删除cookie? 使用cookie传递参数的示例 什么是cookie? cookie是一种用于存储浏览器访问网站时的小文件。当用户访问一个网站,服务器会将cookie文件存储到用户的计算机上,当用…

    JavaScript 2023年6月11日
    00
  • Textbox控件注册回车事件及触发按钮提交事件具体实现

    Textbox控件注册回车事件及触发按钮提交事件是Web开发中常用的技术之一。下面我将详细讲解如何实现这个功能。 注册回车事件 在Textbox控件中,我们可以向其绑定keypress事件,通过该事件判断当用户按下回车键时执行某些操作,比如提交表单等。下面是一个简单示例: <input type="text" id="my…

    JavaScript 2023年6月11日
    00
  • JavaScript中常见内置函数用法示例

    JavaScript中常见内置函数用法示例 JavaScript中包含许多内置函数,这些函数能够很好地帮助开发者处理各种任务。下面将介绍JavaScript中常见内置函数的一些用法示例。 String函数 String函数可以用来处理字符串,包括截取、相加、判断字符串是否符合正则表达式等。 截取字符串 可以通过slice、substring、substr等函…

    JavaScript 2023年5月27日
    00
  • 浅谈javascript语法和定时函数

    浅谈JavaScript语法和定时函数 JavaScript语法 JavaScript是一种基于对象的脚本语言,主要应用于Web前端和服务器端的开发。下面我们来简单介绍一下JavaScript的语法: 数据类型 JavaScript的数据类型包括:字符串、数字、布尔值、对象、数组、null和undefined。 示例代码: var str = ‘hello’…

    JavaScript 2023年5月27日
    00
  • JS中this的4种绑定规则详解

    下面是对于“JS中this的4种绑定规则详解”的完整攻略: 1. 默认绑定规则 默认绑定规则是指,在函数调用时,若函数调用时调用点没有指定调用的对象,this会绑定在全局对象上,即window(在浏览器环境下)。 示例代码如下: function foo() { console.log(this.a); } var a = 2; foo(); // 输出2 …

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部