在我的脚本中需要创建一个哈希表,我在谷歌中搜索了这个。大多数人为此目的推荐 JavaScript 对象。问题是哈希表中的某些键有一个“.”。在他们之中。我可以使用关联数组轻松创建这些键。
我不明白为什么关联数组不好。在我查看的网站上提到的第一件事是长度属性。
我来自 Perl 背景,在那里我使用了哈希。最常见的用途是从键中获取值、检查键是否存在、删除键值对以及添加键值对。如果这些是我的常用用途,我可以安全地使用关联数组吗?
在我的脚本中需要创建一个哈希表,我在谷歌中搜索了这个。大多数人为此目的推荐 JavaScript 对象。问题是哈希表中的某些键有一个“.”。在他们之中。我可以使用关联数组轻松创建这些键。
我不明白为什么关联数组不好。在我查看的网站上提到的第一件事是长度属性。
我来自 Perl 背景,在那里我使用了哈希。最常见的用途是从键中获取值、检查键是否存在、删除键值对以及添加键值对。如果这些是我的常用用途,我可以安全地使用关联数组吗?
在 JavaScript 中,对象是关联数组……它们没有单独的概念。您还可以安全地使用 '.' 在键名中,但您只能使用括号表示法访问该值:
var foo = {}
foo['bar'] = 'test';
foo['baz.bin'] = 'value';
alert(foo.bar); // Shows 'test'
alert(foo['baz.bin']); // Shows 'value'
如果您已经在使用它们并且它们有效,那么您就是安全的。
在 JavaScript 中,对象和数组几乎是一回事,数组具有一些神奇的功能(自动更新长度属性等)和适用于数组的原型方法。构造一个对象也比使用关联数组容易得多:
var obj = {"my.key": "myValue"};
对比
var obj = [];
obj["my.key"] = "myValue";
因此永远不要为此使用数组对象,而只是使用常规对象。
一些功能:
var obj = {}; // Initialized empty object
删除键值对:
delete obj[key];
检查密钥是否存在:
key in obj;
获取键值:
obj[key];
添加键值对:
obj[key] = value;
因为JavaScript 中没有内置关联数组这样的东西。这就是为什么它很糟糕。
事实上,当你使用类似的东西时:
theArray["a"] = "Hello, World!";
它只是创建一个名为“a”的属性并将其值设置为“Hello, World!”。这就是为什么长度总是0,以及为什么输出alert(theArray)
为空的原因。
实际上,“关联数组”与 ECMAScript 中的“类数组对象”几乎相同。甚至数组也是 ECMAScript 中的对象,只是有数字键(它们仍然是后台的字符串)和一个.length
属性,以及一些从Array.prototype
.
因此,Perl 哈希和 ECMAScript 对象的行为相似。您可能不知道不仅可以通过点访问对象属性,还可以使用方括号和字符串访问对象属性,例如
var myObj = { foo: 42 };
myObj.foo; // 42
myObj['foo']; // 42
知道这一点,您还可以使用键 .
var myObj = { };
myObj['hello.foo.world'] = 42;
当然,您只能使用括号表示法访问该键。
.
如果您愿意,您可以在 JavaScript 对象(AKA 关联数组)上使用键名;他们被毫无问题地接受了。一个小缺点是你不能使用带点键的快捷符号,例如
var x = {};
x['hello'] = 'there';
alert(x.hello);
是完全可以接受的,并且会弹出一个带有“那里”的警报。但是如果你使用带点的名字:
var x = {};
x['this.is'] = 'sparta';
alert(x.this.is);
将失败,因为 JavaScript 将查找this
在 x 对象中命名的属性,该属性不存在。只有this.is
属性。