Javascript 具有键的数组对象是否损坏?(混合关联数组样式)

Javascript 具有键的数组对象是否损坏?(混合关联数组样式),javascript,arrays,associative-array,Javascript,Arrays,Associative Array,在最近的一个项目中,我需要有序条目加上集合的特殊类型属性,这就是我最终得到的结果: var array=['a','b']; array.type = 'alphabet'; console.log(array); //["a", "b", type: "alphabet"] 到目前为止,它运行良好 我没有找到太多关于这种阵列的文档,这种设计有什么缺点吗?从技术上讲,这是可行的。如果它能满足您的需要,我真的不明白您为什么不使用它。 但是,有几件事需要记住: JSON.stringify不会

在最近的一个项目中,我需要有序条目加上集合的特殊类型属性,这就是我最终得到的结果:

var array=['a','b'];
array.type = 'alphabet';

console.log(array);
//["a", "b", type: "alphabet"] 
到目前为止,它运行良好


我没有找到太多关于这种阵列的文档,这种设计有什么缺点吗?

从技术上讲,这是可行的。如果它能满足您的需要,我真的不明白您为什么不使用它。
但是,有几件事需要记住:

JSON.stringify
不会对这些属性进行stringify,而迭代数组的
for
循环只会在使用
for…in
时捕获这些属性:

var数组=['a','b'];
array.type='alphabet';
document.write('JSON.stringify(array)
'); document.write(JSON.stringify(数组)); 编写(“

用于in:
”); for(数组中的变量a) document.write(a+':'+数组[a]+'
';//将显示`类型` document.write(“
对于循环:
”为“正常”) 对于(var i=0;idocument.write(i+':'+数组[i]+'
';//不会显示“类型”< /代码> <>这是在JavaScript范围内工作的,但是考虑到这个“强”>数据结构< /强>可以遍历系统和序列化方案,同样的事情在其他地方也不起作用。您应该以跨多个系统理解的形式保持数据结构“中立”;根据需要使用数组和对象数据结构。列表和地图是目前普遍理解的概念,在任何地方都得到支持;这两者的混合并不一定,而且可能会使您的数据很难转换到其他系统。即使您只需要在Javascript中序列化数据(例如存储在cookie中),也会遇到问题

您只需以同样有效且普遍理解的格式表达您的数据:

{ type: 'alphabet', values: ['a', 'b'] }

您可以这样做,但实际上您并没有使用数组作为数组,因此此数组的使用者需要知道您的“数组”在某些方面是特殊的,以及如何使用它,这是不这样做的充分理由。@deceze这是一个简化的示例,我正在使用的实际代码是
points=[[type:'m',[0,0]],[type:'C',[22,33],[34,42],[66,88]].…]
我需要保持包装的顺序array@maioman:这将引发语法错误:
未捕获的语法错误:意外标记:
@Alnitak Oh Ok。抱歉。@maioman它无法工作,没有使用您上面引用的特定语法。
JSON.stringify
的行为是一个很好的观点,但除此之外,是的,这似乎并不比向DOM元素添加自定义属性更糟糕。如果必须进行某种序列化,您是对的。换句话说,是否使用这样的数据结构取决于用例。对,但问题是,在现实中,你不能总是预测你将在哪里使用它。你的应用程序可能会增长和扩展,突然需要序列化弹出窗口,但现在你已经把自己画进了一个角落。如果你按照记录在案的API规范编写代码,并按预期使用数据结构,那么你可以自己绘制的角落就少多了。不过,并非每个项目都必须是可扩展的。我并不反对你。我只是说这种结构在某些情况下是完全有效的。你对序列化的看法是绝对正确的(这是我没有想到的一个方面)。相反,就性能而言,我测试了混合数组和嵌套数组的对象;有趣的是基于浏览器的结果有偏差(在chrome上Hydrod阵列的性能提高了10%,而在FF上则降低了30%;令我惊讶的是,FF整体性能更高)。