我有一个不太理想的情况,我无法更改函数的签名,但需要让它在其输出中传递附加信息以获取新功能。
这可以吗?
q = [ 1 , 2 ,3]
q.meta-data = {additional:'information'}
这仅分配给q吗?
这对其他数组对象有影响吗?
是否存在这种情况会破坏某些东西或它会继续正常运行?
我有一个不太理想的情况,我无法更改函数的签名,但需要让它在其输出中传递附加信息以获取新功能。
这可以吗?
q = [ 1 , 2 ,3]
q.meta-data = {additional:'information'}
这仅分配给q吗?
这对其他数组对象有影响吗?
是否存在这种情况会破坏某些东西或它会继续正常运行?
为什么不把数据和元数据分成两个属性呢?
q = {
data: [1, 2, 3],
'meta-data': { additional: 'information' }
};
不,它不会为其他数组分配任何东西 - 因为您在这里使用特定对象,而不是它的原型。
但是,是的,在某些情况下它会咬你一口。例如,其他一些开发人员可能认为迭代存储在q
withfor-in
循环中的 Array 是一个聪明的主意。
如果您将属性分配给q
,那只会影响。其他数组会很好。 q
使用这种方法的唯一问题是,如果您使用for..in
循环数组。只要您只使用“正常”for
循环或.forEach
(无论如何您都应该这样做)循环它,您就不应该有任何问题。
PSq.meta-data
是语法错误(-
)。你需要做q.metadata
(或q.meta_data
)或q['meta-data']
。
其他答案很好,但您也可以将数组转换为“类数组”对象。
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); });
我个人不喜欢向数组添加属性,因为这可能会产生意想不到的后果。我可能会添加一个作为输出参数的附加参数。像这样的东西:
function cantChangeReturn(arg1, arg2, optionalOutputArg) {
// do stuff
if (optionalOutputArg) {
optionalOutputArg.extraResult = extraResult;
}
return result;
}
这样,额外的数据就不会泄漏到程序的其他不需要它并且不期望它的部分。