关联数组与javascript中的对象

SAN*_*SAN 61 javascript

在我的脚本中需要创建一个哈希表,我在谷歌搜索这个.大多数人都为此目的推荐JavaScript对象.问题是,哈希表中的一些键有".".在他们中.我可以使用关联数组轻松创建这些键.

我不明白为什么关联数组很糟糕.在我看到的网站中提到的第一件事是长度属性.我来自Perl背景,我使用哈希.最常见的用途是从密钥中获取值,检查密钥是否存在,删除键值对,添加键值对.如果这些是我的常用用途,我可以安全地使用关联数组吗?

Jus*_*ner 88

在JavaScript中,对象是关联数组......对于它们没有单独的概念.您也可以安全地使用'.' 在密钥名称中,但您只能使用括号表示法访问该值:

var foo = {}
foo['bar'] = 'test';
foo['baz.bin'] = 'value';

alert(foo.bar); // shows 'test'
alert(foo['baz.bin']); // shows 'value'
Run Code Online (Sandbox Code Playgroud)

如果您已经使用它们并且它们正常工作,那么您就是安全的.

  • 请注意,与PHP关联数组相反,对象属性未排序,即您不能依赖它们的顺序. (11认同)
  • 我认为您不能将对象概括为关联数组,主要是因为对象不会具有关联数组已实现的方法。(例如:“map”、“reduce”、“filter”等) (2认同)

Esa*_*ija 33

在javascript对象和数组中几乎是一回事,数组具有一些神奇的功能(自动调整长度属性等)和适用于数组的原型方法.构造对象比使用关联数组要容易得多:

var obj = {"my.key": "myValue"};
Run Code Online (Sandbox Code Playgroud)

VS

var obj = [];
obj["my.key"] = "myValue";
Run Code Online (Sandbox Code Playgroud)

因此,永远不要使用数组对象,而只使用常规对象.

一些功能:

var obj = {}; //Initialized empty object
Run Code Online (Sandbox Code Playgroud)

删除键值对:

delete obj[key];
Run Code Online (Sandbox Code Playgroud)

检查密钥是否存在:

key in obj;
Run Code Online (Sandbox Code Playgroud)

获得关键值:

obj[key];
Run Code Online (Sandbox Code Playgroud)

添加键值对:

obj[key] = value;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的一部分是关于不使用数组作为关联数组,因为它需要两行代码而不是一行,这是非常误导的.该构造不会填充目标元素,它设置数组的属性,完全如同@Dominic Goulet和NullUserException同时在帖子中描述的那样,IMO是正确的答案.它的行为就像一个关联数组(你可以引用obj ["my.key"])的唯一原因是数组的属性是一个对象,而对象就像Javascript具有关联数组一样接近. (2认同)
  • 我不认为说JS中的数组和对象是一样的是正确的.我的意思是,按照这个标准,JS中的所有内容都与对象大致相同.数组允许您像任何其他类型的对象一样设置任意属性.但是,对象本身没有有序数据的概念. (2认同)

Dom*_*let 19

因为在javascript中没有内置关联数组这样的东西.这就是为什么它很糟糕.

事实上,当你使用类似的东西:

theArray["a"] = "hello, world!";
Run Code Online (Sandbox Code Playgroud)

它只是创建一个名为"a"的PROPERTY,并将其值设置为"hello,world!".这就是为什么长度始终为0,以及输出alert(theArray)为空的原因.

希望这可以帮助!


jAn*_*ndy 8

实际上,"关联数组"与ECMAscript中的"类数组对象"几乎相同.甚至Arrays是ECMAscript中的对象,只是有数字键(在后台仍然是字符串)的例外,.length属性以及一些继承的方法Array.prototype.

因此,perl哈希和ECMAscript对象的行为类似.您可能不知道您不仅可以通过点访问对象属性,还可以使用括号和字符串来访问对象属性

var myObj = { foo: 42 };

myObj.foo; // 42
myObj['foo']; // 42
Run Code Online (Sandbox Code Playgroud)

知道这一点,你也可以使用键 .

var myObj = { };
myObj['hello.foo.world'] = 42;
Run Code Online (Sandbox Code Playgroud)

当然,您只能使用括号表示法访问该键.


Mar*_*c B 7

.如果您愿意,可以在JS对象(也称为关联数组)上使用键名,它们可以毫无问题地被接受.缺点是您不能使用带有虚线键的快捷符号,例如

var x = {};
x['hello'] = 'there';
alert(x.hello);
Run Code Online (Sandbox Code Playgroud)

是完全可以接受的,并会在其中弹出"有"的警报.但是如果你使用虚线名称:

var x = {};
x['this.is'] = 'sparta';
alert(x.this.is);
Run Code Online (Sandbox Code Playgroud)

将失败,因为Javascript将查找this在x对象中命名的属性,该属性不存在.只有this.is属性.