2

我有一个不太理想的情况,我无法更改函数的签名,但需要让它在其输出中传递附加信息以获取新功能。

这可以吗?

q = [ 1 , 2 ,3]
q.meta-data = {additional:'information'}

这仅分配给q吗?
这对其他数组对象有影响吗?
是否存在这种情况会破坏某些东西或它会继续正常运行?

4

5 回答 5

3

为什么不把数据和元数据分成两个属性呢?

q = {
  data: [1, 2, 3],
  'meta-data': { additional: 'information' }
};
于 2013-08-28T17:31:46.100 回答
3

不,它不会为其他数组分配任何东西 - 因为您在这里使用特定对象,而不是它的原型。

但是,是的,在某些情况下它会咬你一口。例如,其他一些开发人员可能认为迭代存储在qwithfor-in循环中的 Array 是一个聪明的主意。

于 2013-08-28T17:32:05.557 回答
1

如果您将属性分配给q,那只会影响。其他数组会很好。 q

使用这种方法的唯一问题是,如果您使用for..in循环数组。只要您只使用“正常”for循环或.forEach(无论如何您都应该这样做)循环它,您就不应该有任何问题。

PSq.meta-data是语法错误(-)。你需要做q.metadata(或q.meta_data)或q['meta-data']

于 2013-08-28T17:33:36.547 回答
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); });
于 2013-08-28T17:37:03.693 回答
0

我个人不喜欢向数组添加属性,因为这可能会产生意想不到的后果。我可能会添加一个作为输出参数的附加参数。像这样的东西:

function cantChangeReturn(arg1, arg2, optionalOutputArg) {
  // do stuff
  if (optionalOutputArg) {
    optionalOutputArg.extraResult = extraResult;
  }
  return result;
}

这样,额外的数据就不会泄漏到程序的其他不需要它并且不期望它的部分。

于 2013-08-28T17:43:40.060 回答