在Javascript中向数组添加属性——糟糕的主意?

在Javascript中向数组添加属性——糟糕的主意?,javascript,d3.js,Javascript,D3.js,我用D3做了很多事情,所以我有很多值数组,为了让代码更清晰,而不是把值数组放在另一个对象中,包含元信息(比如名称、颜色等等),我只是将这些元信息设置为数组的属性。它使代码更加清晰,并且更容易对相关数据执行d3操作/其他操作 有什么会伤害我的吗?key不能正常工作,在控制台中查看代码会稍微困难一些,但我可以解决这个问题 代码示例: 而不是 var a = { name = "something", foo = "bar" values = [{x: 1, y:2}, ,

我用D3做了很多事情,所以我有很多值数组,为了让代码更清晰,而不是把值数组放在另一个对象中,包含元信息(比如名称、颜色等等),我只是将这些元信息设置为数组的属性。它使代码更加清晰,并且更容易对相关数据执行d3操作/其他操作

有什么会伤害我的吗?key不能正常工作,在控制台中查看代码会稍微困难一些,但我可以解决这个问题

代码示例:

而不是

var a = {
    name = "something",
    foo  = "bar"
    values = [{x: 1, y:2}, , , ]
};

var a = [{x:1, y:2}, , , , ];
a.name = "something";
a.foo  = "bar"

在编写代码时,我喜欢遵循“最少惊喜”的原则。看到将自定义属性添加到数组中,我会有点惊讶,因为我真的不希望这样。你必须问自己:“这些属性真的属于数组吗?”。我认为答案是“不”。您所拥有的数据只是随阵列一起使用。因此,我喜欢您采用的声明式方法:

var data = {
    name = "something",
    foo  = "bar"
    values = [{x: 1, y:2}]
}
这更容易阅读,而且在执行诸如
data.name
data.foo
data.values
之类的操作时,它更有意义。在这种情况下,对数据的访问是相当统一的。但是,如果要使用另一种方法,您将访问
data.foo
data.name
,但要访问
数据本身的值。我不希望数组有额外的属性,所以虽然我理解代码,但这是一个额外的认知负载,我并不真正需要


因此,从阅读代码的人(包括您!)的角度出发,并考虑到未来的维护和理解,我会选择第一个选项。

我会让更有经验的人给出更严格的答案,但我认为如果这有助于代码更清晰,工作流程更好,我愿意容忍对性能的轻微影响,尽管我认为这不应该成为您的问题!对于问题的性能部分,这里有一个很好的答案供大家阅读:我在youtube上看到一个视频,其中指出在您的第二个代码片段中,编译器对代码的优化能力较差。我还没有找到这段视频,但它与chrome游戏性能有关,并在过去10个月内发布。