Update reader.

This commit is contained in:
Bruce
2026-04-04 19:27:45 +08:00
parent f9f4db3f6c
commit bf54d5a531
22 changed files with 3405 additions and 21 deletions

View File

@@ -529,4 +529,102 @@
}
global.Set = Set;
}
})(this);
(function(global) {
// 如果原生 WeakMap 已存在,则不覆盖
if (typeof global.WeakMap !== "undefined") {
return;
}
function WeakMap(iterable) {
// 必须使用 new 调用
if (!(this instanceof WeakMap)) {
throw new TypeError('Constructor WeakMap requires "new"');
}
// 私有存储:每个实例独立维护一个键值对数组
var entries = [];
// 验证 key 必须是对象或函数(不能是 null 或原始值)
function validateKey(key) {
if (key === null || (typeof key !== 'object' && typeof key !== 'function')) {
throw new TypeError('WeakMap key must be an object');
}
}
// 设置键值对
this.set = function(key, value) {
validateKey(key);
for (var i = 0; i < entries.length; i++) {
if (entries[i][0] === key) {
entries[i][1] = value;
return this;
}
}
entries.push([key, value]);
return this;
};
// 获取键对应的值
this.get = function(key) {
validateKey(key);
for (var i = 0; i < entries.length; i++) {
if (entries[i][0] === key) {
return entries[i][1];
}
}
return undefined;
};
// 判断是否存在指定键
this.has = function(key) {
validateKey(key);
for (var i = 0; i < entries.length; i++) {
if (entries[i][0] === key) {
return true;
}
}
return false;
};
// 删除指定键及其值
this.delete = function(key) {
validateKey(key);
for (var i = 0; i < entries.length; i++) {
if (entries[i][0] === key) {
entries.splice(i, 1);
return true;
}
}
return false;
};
// 处理可选的初始化参数iterable例如 [[key1, value1], [key2, value2]]
if (iterable !== null && iterable !== undefined) {
// 支持数组或类数组(具备 forEach 方法的对象)
if (typeof iterable.forEach === 'function') {
var self = this;
iterable.forEach(function(item) {
if (!Array.isArray(item) || item.length < 2) {
throw new TypeError('Iterator value is not an entry object');
}
self.set(item[0], item[1]);
});
} else if (typeof iterable.length === 'number') {
// 类数组对象(如 arguments
for (var i = 0; i < iterable.length; i++) {
var item = iterable[i];
if (!Array.isArray(item) || item.length < 2) {
throw new TypeError('Iterator value is not an entry object');
}
this.set(item[0], item[1]);
}
} else {
throw new TypeError('WeakMap iterable is not iterable');
}
}
}
// 挂载到全局对象
global.WeakMap = WeakMap;
})(this);