我有一个不太理想的情况,我无法更改函数的签名,但需要在输出中传递其他信息以用于新功能。
这样做可以吗?
q = [ 1 , 2 ,3]
q.meta-data = {additional:'information'}
这只是分配给q吗?
这是否对其他阵列物体产生任何影响?
是否会出现这种情况会破坏或继续正常运作?
答案 0 :(得分:3)
为什么不将数据和元数据分成两个属性?
q = {
data: [1, 2, 3],
'meta-data': { additional: 'information' }
};
答案 1 :(得分:3)
不,它没有为其他数组分配任何东西 - 因为你在这里处理一个特定的对象,而不是它的原型。
但是,在某些情况下,它会让你感到害怕。例如,其他一些开发人员可能认为用q
循环遍历存储在for-in
中的数组是个明智之举。
答案 2 :(得分:1)
如果您将属性分配给q
,那只会影响 q
。其他阵列也没问题。
这种方法唯一的问题是如果使用for..in
来循环数组。只要您使用“普通”for
循环或.forEach
(无论如何都应该这样做)循环它,您就不会有任何问题。
P.S。 q.meta-data
是语法错误(-
)。您需要q.metadata
(或q.meta_data
)或q['meta-data']
。
答案 3 :(得分:1)
其他答案很棒,但您也可以将数组转换为“类似数组”的对象。
objq = {};
q.forEach(function (elem, idx) {
objq[idx] = elem;
});
objq.length = q.length;
objq["meta-data"] = {additional: "information"};
objq
没有数组方法,但您可以调用它们:
Array.prototype.forEach.call(objq, function (elem) { console.log(elem); });
答案 4 :(得分:0)
我个人不喜欢向数组添加属性,因为这会产生意想不到的后果。我可能会添加一个作为输出参数的附加参数。像这样:
function cantChangeReturn(arg1, arg2, optionalOutputArg) {
// do stuff
if (optionalOutputArg) {
optionalOutputArg.extraResult = extraResult;
}
return result;
}
这样,额外的数据不会泄漏到程序中不需要它的其他部分,也不会泄漏。