我正在学习javascript,在阅读了有关如何初始化对象的教程后,我发现了以下示例:
var obj = { property_1: value_1, // property_# may be an identifier...
2: value_2, // or a number...
// ...,
"property n": value_n }; // or a string
我怀疑在这个属性中有一个数字作为名称。我理解这一点,但我找不到使用它的真正好处。我读了this question,从我的观点来看,这种表示法可能导致我的代码设计错误或不必要的复杂性,所以我想知道为什么存在这种语法。
经常使用这种声明吗?在什么样的情况下,这可能是一个理想的替代方案?
答案 0 :(得分:1)
JavaScript数组是一些键是整数(*)的对象。
[9, 8, 7]
类似于对象{ 0: 9, 1: 8, 2: 7 }
。
主要区别在于数组的原型为Array.prototype
而不是Object.prototype
。
(*)正如Benjamin Gruenbaum所指出的,数组键对UInt32是可强制的。对象的键始终是字符串或符号。正如djechlin指出的那样,允许数组具有任何类型的键的属性,但我不建议在数组上添加自己的非整数键。
在任何函数(*)中都可以使用名为arguments
的类似数组的对象。函数接收的每个参数都是arguments
上的属性,具有类似整数的键。
在以下代码中,example
调用返回类似{ 0: 9, 1: 8, 2: 7, length: 3 }
的对象。
function example(a, b, c) {
return arguments;
}
example(9, 8, 7);
(*)In modern JavaScript, there is no arguments
object in arrow functions.
答案 1 :(得分:1)
在创建稀疏数组和矩阵时使用整数作为对象键非常有用,例如将1000个元素向量与除第10个元素之外的所有位置映射为
v = {10: 1}
这里不能使用JS数组,因为您需要能够使用键指定元素位置。
在ECMAscript 6中使用[Map]
1更好,因为它实际上是一个映射,但在基于旧ES标准的代码库中,您可能仍会看到对象用于这样的映射
答案 2 :(得分:0)
该代码旨在说明问题。但是,既然你问了一个可以使用它的例子,让我给你一些。
如果您收到JSON格式的数据,就会发生这种情况 这个。取决于外部系统的细节。
另一个可能是为了保持一致性。例如。假设你有一个数据模型 从中生成HTML。可能是用途 每个字段的可能值的对象(假设字段 只能取一个可能的值之一)。这些领域 然后可以呈现为单选按钮或选择。一些 这些字段将使用字符串作为可能的值,因此自然 事情是tyo使可能的值列表成为一个对象。但一些 将使用整数键 - 仍然可能更好地坚持列表 永远是一个对象。
E.g。
var prio_field_pos_vals = {
0: 'Show Stopper',
1: 'Urgent',
2: 'High',
3: 'Low'
}
当然,这可能不会被定义为独立变量,而是作为模型的一部分,但你明白了。我会避免对象的整数键(以及字符串中带空格的键),除非你有理由,但是当你有理由时,使用它们。