当前位置: 首页 > wzjs >正文

我要做网站做网站临泉seo个人优化方案案例

我要做网站做网站临泉,seo个人优化方案案例,王占山人物简介,世界上做的最好的前端网站目录 WeakSet 详解 基本概念 创建 WeakSet WeakSet 的主要方法 WeakSet 的特性 WeakSet 的使用场景 1. 避免内存泄漏(DOM 元素管理) 2. 临时缓存系统 3. 私有属性模拟 4. 防止循环引用 与其他数据结构的对比 1. WeakSet 没有实例属性 2. We…

目录

WeakSet 详解

基本概念

创建 WeakSet

WeakSet 的主要方法

WeakSet 的特性

WeakSet 的使用场景

1. 避免内存泄漏(DOM 元素管理)

2. 临时缓存系统

3. 私有属性模拟

4. 防止循环引用

与其他数据结构的对比

1. WeakSet 没有实例属性

2. WeakSet 仅有的方法

3. 原型链属性

WeakSet 注意事项

WeakSet 最佳实践建议

完整HTML示例代码

WeakSet 详解

WeakSet 是 JavaScript 中的一种集合类型,与普通的 Set 类似,但有一些重要的区别。下面我将详细讲解 WeakSet 的特性、用法以及与 Set 的区别

基本概念

WeakSet 是一种特殊的集合,它只能存储对象引用,不能存储原始值(如数字、字符串、布尔值等)。与 Set 不同,WeakSet 中的对象是弱引用的,这意味着如果没有其他引用指向这些对象,它们可以被垃圾回收机制自动回收。

创建 WeakSet

const weakSet = new WeakSet();const obj1 = {};
const obj2 = {};// 添加对象到 WeakSet
weakSet.add(obj1);
weakSet.add(obj2);console.log(weakSet.has(obj1)); // true

WeakSet 的主要方法

  1. add(value): 向 WeakSet 添加一个对象

  2. delete(value): 从 WeakSet 中移除指定的对象

  3. has(value): 检查 WeakSet 中是否包含指定的对象

注意:WeakSet 没有 size 属性,也没有 clear() 方法,也不能被遍历(没有 forEachkeysvalues 等方法)

WeakSet 的特性

1.只能存储对象引用

const weakSet = new WeakSet();
weakSet.add(1); // TypeError: Invalid value used in weak set
weakSet.add("string"); // TypeError: Invalid value used in weak set

2.弱引用特性

  • 如果 WeakSet 中的对象没有其他引用,它会被垃圾回收

  • 这使得 WeakSet 适合用于存储临时对象或私有数据

3.不可枚举

  • 无法获取 WeakSet 中的所有值

  • 没有 size 属性,无法知道集合中有多少元素

WeakSet 的使用场景

1. 避免内存泄漏(DOM 元素管理)

场景:跟踪 DOM 元素是否被处理过

const processedElements = new WeakSet();document.querySelectorAll(".btn").forEach(btn => {processedElements.add(btn);btn.addEventListener("click", () => {if (processedElements.has(btn)) {// 确保只处理一次}});
});// 当 DOM 元素被移除时,WeakSet 自动清理引用

2. 临时缓存系统

场景:缓存计算结果,当对象不再使用时自动失效

const cache = new WeakSet();function heavyCalculation(obj) {if (cache.has(obj)) {return "结果来自缓存";}const result = /* 复杂计算 */;cache.add(obj);return "结果来自计算";
}

3. 私有属性模拟

场景:标记对象是否已初始化(ES6 Class)

const initialized = new WeakSet();class SecureAPI {constructor() {initialized.add(this);}fetchData() {if (!initialized.has(this)) {throw new Error("必须先初始化实例");}// 安全执行逻辑}
}

4. 防止循环引用

场景:深度拷贝时记录已处理对象

function deepClone(obj, visited = new WeakSet()) {if (typeof obj !== "object" || obj === null) return obj;if (visited.has(obj)) return null; // 避免循环引用visited.add(obj);// 继续克隆逻辑...
}

与其他数据结构的对比

特性WeakSetSetWeakMap
键类型对象任意值对象
值类型无(仅存储对象引用)任意值任意值
垃圾回收自动清理无引用的键不自动清理自动清理无引用的键
遍历能力❌ 不可遍历✅ 可遍历❌ 不可遍历
典型场景临时标记、防内存泄漏通用集合操作对象关联元数据

1. WeakSet 没有实例属性

  • 没有 size 属性
    Set 有 size 属性可以获取元素数量,但 WeakSet 没有类似属性
    原因:WeakSet 的元素是弱引用,垃圾回收可能随时移除元素,无法保证 size 的准确性。

  • 没有迭代器属性
    Set 支持 keys()values()entries() 等迭代方法,但 WeakSet 不支持遍历

2. WeakSet 仅有的方法

WeakSet 只有以下 3 个核心方法(无属性):

方法名作用示例
add(value)添加对象到 WeakSetweakSet.add(obj)
has(value)检查对象是否存在weakSet.has(obj) → true
delete(value)删除指定对象weakSet.delete(obj)

3. 原型链属性

通过 Object.getOwnPropertyNames(WeakSet.prototype) 可以看到,WeakSet 的原型链上只有方法,没有属性:

console.log(Object.getOwnPropertyNames(WeakSet.prototype)); 
// 输出: ["constructor", "add", "delete", "has"]

WeakSet 注意事项

  1. WeakSet 不可迭代,因此不能使用 for...of 循环

  2. 不能查看 WeakSet 中的所有内容,只能检查特定对象是否存在

  3. 主要用于存储额外的对象信息,而不是作为主要的数据存储结构

WeakSet 最佳实践建议

  1. 优先用于临时性数据:WeakSet 适合存储短期存在的对象关联信息。

  2. 结合内存分析工具:使用 Chrome DevTools 的 Memory 面板验证内存管理效果。

  3. 避免替代普通 Set:需要统计数量或遍历时,必须使用普通 Set。

  4. 类型安全检查:添加对象前验证类型:

    function addToWeakSet(ws, obj) {if (typeof obj !== "object" || obj === null) {throw new TypeError("WeakSet 只接受对象");}ws.add(obj);
    }

完整HTML示例代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WeakSet 完整方法演示</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}button {margin: 5px;padding: 8px 12px;background: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;}#output {margin-top: 20px;padding: 15px;background: #f5f5f5;border-radius: 4px;}.obj-id {color: #2196F3;font-weight: bold;}</style>
</head>
<body>
<h2>WeakSet 方法演示</h2><div><button onclick="createObject()">1. 创建新对象</button><button onclick="addToWeakSet()">2. 添加到 WeakSet</button><button onclick="checkInWeakSet()">3. 检查是否存在</button><button onclick="deleteFromWeakSet()">4. 删除对象</button>
</div><div id="output"></div><script>const weakSet = new WeakSet();let currentObject = null;// 用于跟踪对象IDlet objectCounter = 0;function createObject() {currentObject = { id: `obj_${++objectCounter}` };log(`创建新对象: <span class="obj-id">${currentObject.id}</span>`);}function addToWeakSet() {if (!currentObject) return;weakSet.add(currentObject);log(`已添加对象 <span class="obj-id">${currentObject.id}</span> 到 WeakSet`);}function checkInWeakSet() {if (!currentObject) return;const exists = weakSet.has(currentObject);log(`对象 <span class="obj-id">${currentObject.id}</span> 在 WeakSet 中: ${exists}`);}function deleteFromWeakSet() {if (!currentObject) return;const deleted = weakSet.delete(currentObject);log(`删除对象 <span class="obj-id">${currentObject.id}</span>: ${deleted ? '成功' : '失败'}`);}function log(message) {const output = document.getElementById('output');output.innerHTML += `${message}<br>`;output.scrollTop = output.scrollHeight;}
</script>
</body>
</html>

http://www.dtcms.com/wzjs/227604.html

相关文章:

  • 本科自考有什么专业泰安seo网络公司
  • 西安企业建站中国十大网站排名
  • 国际网站怎么进网站手机优化
  • 什么网站可以做美食推广平台排行榜
  • 外贸型网站建设温州seo网站建设
  • 成都建设网站的公司焊工培训
  • 如何阿里巴巴网站做推广方案潍坊seo排名
  • 手机上怎么做投票网站江苏关键词推广seo
  • 网站图片移动怎么做百度seo快速排名优化
  • 宝鸡网站建设排行榜长沙百度地图
  • 吉林省住房和城乡建设部网站360站长
  • 云南建水疫情最新消息今天杭州seo网站优化
  • 珠海澳门网站建设附近学电脑培训班
  • 一个网站需要多少空间什么是核心关键词
  • word做网站百度普通收录
  • 四平网站制作北京百度seo关键词优化
  • 做网站和自媒体哪个好关键词在线播放免费
  • 汕头吧百度贴吧游戏优化是什么意思
  • 自己的网站怎么做进销存游戏推广对接平台
  • 深圳做网站广告联盟官网入口
  • 长沙房地产信息网官网旅游企业seo官网分析报告
  • 宝鸡做网站哪家公司好沧州百度推广公司
  • 深圳网站建设开发哪家好免费关键词挖掘工具
  • 微信登录建设银行网站网络营销公司
  • 基于网站优化的搜索引擎推广方法大型的营销型网站
  • 长沙网站搭建首选智投未来网络营销公司注册找哪家
  • 柳州网站制作公司百度搜索引擎的原理
  • 韶关网站建设价格搜索引擎优化的英语简称
  • 做黄图网站接广告好赚吗搜索引擎网站优化推广
  • 做网站网络电商平台推广公司