JavaScript Hashtable 修正版源码与功能详解

作者:代码拾荒

时间:2026-10-25

浏览:170

本文介绍了一个修正版的 JavaScript Hashtable 实现,主要修复了 set 方法中 length 属性被错误覆盖的 Bug。该版本支持键名忽略大小写、对象克隆以及获取默认值等功能,提供了完整的源代码供开发者下载和使用。

文章目录

修正版 Hashtable 核心功能介绍

此版本修正了 Hashtable 对象中 set 方法的一个特定 Bug,该 Bug 会导致调用 obj.set("length", "0") 时出现异常或错误行为。


新增功能支持在 Hashtable 中设置键名忽略大小写,使得查找和存储键值对时不区分大小写。


实现了 Hashtable 对象的克隆功能,允许用户复制整个哈希表实例。


增加了 valueOf 方法的支持,允许通过 obj.valueOf("key", "defaultvalue") 的形式在键不存在时返回指定的默认值。


欢迎开发者继续测试并修正其中可能存在的其他 Bug。


JavaScript Hashtable 完整源码实现

具体实现代码如下所示:

 
<html>
<head>
<script type="text/javascript">
// Authors Birdshome, 麻袋@博客园 改版 phito,彭海涛
Object.prototype.Clone = function()
{ 
var objClone;
if ( this.constructor == Object ) objClone = new this.constructor();
else objClone = new this.constructor(this.valueOf());
for ( var key in this )
{ 
if ( objClone[key] != this[key] )
{ 
if ( typeof(this[key]) == 'object' )
{ 
objClone[key] = this[key].Clone();
} 
else
{ 
objClone[key] = this[key];
} 
} 
} 
objClone.toString = this.toString;
objClone.valueOf = this.valueOf;
return objClone;
} 
function Hashtable() {
this.clear = hashtable_clear;
this.containsKey = hashtable_containsKey;
this.containsValue = hashtable_containsValue;
this.get = hashtable_get;
this.isEmpty = hashtable_isEmpty;
this.keys = hashtable_keys;
this.put = hashtable_put;
this.remove = hashtable_remove;
this.size = hashtable_size;
this.toString = hashtable_toString;
this.values = hashtable_values;
this.hashtable = new Object();
this.set = hashtable_set;
this.valueOf = hashtable_valueOf;
this.clone = hashtable_clone;
this.ignoreupperlower = true;
//是否忽略大小写
} 
/*=======Private methods for internal use only========*/
function hashtable_clone(){
return this.Clone();
} 
function hashtable_put(key, value) {
if (this.ignoreupperlower && typeof(key) == "string") {
key = key.toUpperCase();
} 
if (key == null || value == null) {
throw "NullPointerException {" + key + "," + value + "}";
} else {
this.hashtable[key] = value;
} 
} 
function hashtable_set(key, value) {
if (this.ignoreupperlower && typeof(key) == "string") {
key = key.toUpperCase();
} 
if (this.containsKey(key)) {
this.remove(key);
} 
this.put(key, value);
} 
function hashtable_get(key) {
if (this.ignoreupperlower && typeof(key) == "string") {
key = key.toUpperCase();
} 
return this.hashtable[key];
} 
function hashtable_valueOf(key, defvalue) {
var ret = this.get(key);
if (typeof(ret) == "undefined") {
return defvalue;
} 
return ret;
} 
function hashtable_remove(key) {
if (this.containsKey(key)) {
delete this.hashtable[key] ;
} 
} 
function hashtable_isEmpty() {
return (parseInt(this.size()) == 0) ? true: false;
} 
function hashtable_size() {
var size = 0;
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
if (this.hashtable[i] != null) {
size++;
} 
} 
return size;
} 
function hashtable_toString() {
var result = "";
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
if (this.hashtable[i] != null) {
result += "{" + i + ":" + this.hashtable[i] + "}\n";
} 
} 
return result;
} 
function hashtable_clear() {
this.hashtable = new Object();
} 
function hashtable_containsKey(key) {
if (this.ignoreupperlower && typeof(key) == "string") {
key = key.toUpperCase();
} 
var exists = false;
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
if (i == key && this.hashtable[i] != null) {
exists = true;
break;
} 
} 
return exists;
} 
function hashtable_containsValue(value) {
var contains = false;
if (value != null) {
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
if (this.hashtable[i] == value) {
contains = true;
break;
} 
} 
} 
return contains;
} 
function hashtable_values() {
var values = new Object();
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
if (this.hashtable[i] != null) values.push(this.hashtable[i]);
} 
return values;
} 
function hashtable_keys() {
var keys = new Object();
for (var i in this.hashtable) {
if(typeof(this.hashtable[i])=="function"){
continue;
} 
keys.push(i);
} 
return keys;
} 
function test() {
var ht = new Hashtable();
ht.put("3", "Jackson");
ht.put("2", "Tom");
ht.put("4", 3);
ht.set("length", 445555);
ht.set("ddd", "ddd");
ht.set("index", "ddd");
var et = ht.toString();
ht.ignoreupperlower = false;
//忽略大小写
ht.clear();
ht.put("3", "Jackson");
ht.put("2", "Tom");
ht.remove("2");
ht.put("4", 3);
ht.set("length", 5);
//如果用new Array的话该项会设置Array的长度
ht.set("index", "ddd");
ht.set("ddd", "ddd");
alert(et + "" + ht.toString() + "" + ht.size());
var cloneobj=ht.clone();
alert(cloneobj.toString());
} 
</script>
</head>
<body onload="test()">
</body>
</html>

如果你想使用功能更好的hashtable和hashset请下载: http://xiazai.jb51.net/201012/yuanma/jshashtable.rar

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章