有没有办法使用数字类型作为对象键?

Spo*_*pot 70 javascript types key numeric object

似乎当我在对象中使用数字类型作为键名时,它总是被转换为字符串.反正有没有把它作为数字存储?正常的类型转换似乎不起作用.

例:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);
Run Code Online (Sandbox Code Playgroud)

目录输出:

{
    '1': 'a value'
}
Run Code Online (Sandbox Code Playgroud)

想要的是这个:

{
    1: 'a value'
}
Run Code Online (Sandbox Code Playgroud)

建议吗?

谢谢

Mat*_*hen 76

不,这是不可能的. 密钥将始终转换为字符串.请参阅属性访问者文档

属性名称必须是字符串.这意味着非字符串对象不能用作对象中的键.任何非字符串对象(包括数字)都通过toString方法进行类型转换为字符串.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'
Run Code Online (Sandbox Code Playgroud)

  • 即使在数组中,所有属性名称都将转换为字符串. (3认同)
  • @ Roamer-1888:"Javascript数组属性完全独立于数组元素"是一个不正确的语句.`myArray ["1"] = foo`不仅仅是_appear_来设置属性,实际上在属性定义的每个意义上都设置了一个属性(带有键"1").例如,`myArray.hasOwnProperty("1")`产生`true`.从语义上讲,由于具有数字键,此属性也可以被视为"元素",但是没有什么可以将数组"元素"与数组属性区分开来.阅读规范.如果你仍然不同意,请引用你的消息来源. (3认同)
  • @ Roamer-1888:不,不是.唯一的区别是为数组赋予数字属性会影响数组的`length`属性. (2认同)
  • @TimDown,我说的是你错了."在Array上设置数字属性会影响length属性"是一个不正确的语句.Javascript数组属性完全独立于Array元素.令人困惑的是关联语法,例如`myArray ["1"] = foo`,*出现*来设置属性,而它实际上设置了一个数组元素,但只是因为"1"是一个整数的字符串表示,这是完整的语言废话 - 但这是Javascript. (2认同)
  • @Roamer-1888:我宁愿人们了解该语言如何工作的现实(这很可能涉及对规范的一些阅读或参考),而不是一个人对数组和对象属性之间的某些(实际上不存在)差异的先入为主的想法。听起来您正在将另一种语言的想法投射到 JavaScript 上。 (2认同)

cor*_*vid 17

在一个对象中,没有,但我发现Map对此应用程序非常有用.这是我用它来做数字键的地方,这是一个基于键的事件.

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 101 个优雅的 [Ludumdare](https://ldjam.com/) 条目!+1 (2认同)

Rob*_*mos 10

看似ECMA-262-5的设计:

属性标识符类型用于将属性名称与属性描述符相关联.属性标识符类型的值是形式(名称,描述符)的对,其中name是String,描述符是Property Descriptor值.

但是,我没有在ECMA-262-3中看到它的明确规格.无论如何,我不会尝试使用非字符串作为属性名称.


小智 7

Map如果您想要不同的数据类型作为键,您可以使用

const map1 = new Map();

map1.set(1,3)
map1.set('1','string')

// expected output: 3

console.log(map1.get(1)) //output 3;
console.log(map1.get('1')) //output 'string';
Run Code Online (Sandbox Code Playgroud)


小智 5

这是解决方案。如果这不起作用,请告诉我环境设置

const screens = {
    "768": "large",
    "200": "small"
}

const keys = Object.keys(screens).map(key => parseInt(key))
                                         // OR Number(key)

console.log(keys) // Output [200, 768]
Run Code Online (Sandbox Code Playgroud)