【问题标题】:Is it bad to have "number" as object keys?将“数字”作为对象键是不是很糟糕?
【发布时间】:2022-01-24 08:26:19
【问题描述】:

我刚刚搜索了 SO,看起来每个人都同意 JavaScript 和 TypeScript 不支持直接在对象中使用数字作为键的想法。但不知何故,我的开发伙伴在我们的 Angular 项目中使用了一些带有数字键的对象,这些对象与其他对象一样工作得很好。这就是他们的样子。

{
   1: 1,
   2: 0,
   3: 2
}

目前以obj[2] 之类的形式调用该值没有问题。只是想知道这是否是正确的方法,以及这种用法的支持程度如何?

【问题讨论】:

  • 它是标准的数组,是奇异的对象。

标签: javascript angular typescript


【解决方案1】:

它很好,就像它的合法一样,因为它是数组的工作方式,但要注意的一件事是数组将确保键是递增的,从 0 开始,而数字键在一个对象中不会,并且会误导其他开发人员,因为他们无法理解为什么 obj[1] 并不总是存在于 obj[2] 等旁边,我的意思是使用内部循环等并简单地将索引增加一个每一次。所以,我个人不推荐它,因为它看起来像一个数组,但它实际上不是一个数组......

Side - 如果您试图模拟一个数组,但想要一个从 1 开始的索引,只需像往常一样使用数组并让您的代码每次只处理偏移量。数组有很多功能,比如lengthsortfind等对象不会

【讨论】:

  • 感谢您的解释。目前,这些数字代表某些其他对象的 id,因此该对象被用作“具有与这些 id 完全相同的键的对象”,而不是在我的情况下用作数组。不过,也许我应该要求他们将这些键改回字符串。
【解决方案2】:

在javascript中,对象中的键是字符串类型,如果你有obj[1],它会自动变成obj['1'],但在Map中不一样

const obj = {}

obj[1] = 'one';

console.log(obj[1]);
// output: "one"
console.log(obj['1']);
// output: "one"

obj['1'] = 'one string';

console.log(obj[1]);
// output: "one string"
console.log(obj['1']);
// output: "one string"

const map = new Map();
map.set(1, 'one');
map.set('1', 'one string');

console.log(map.get(1));
// output: "one"
console.log(map.get('1'));
// output: "one string"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多