将对象键设置为变量值 - 为什么有两种不同的方式?

时间:2011-10-26 09:44:14

标签: javascript

在JavaScript中,如果您有以下代码:

  var map_id = 100;
  var myobj = {};
  myobj[map_id] = 6;
  var myobj2 = { map_id : 6 };
  console.log(myobj, myobj2);

控制台输出如下:

{ '100': 6 } { map_id: 6 }

问题:

  1. 为什么JavaScript语法在这两种不同情况下的工作方式不同 - 为什么它们设置为文字myobj2而不是map_id的关键字是100?这种差异背后的原因是什么?
  2. 有没有办法以紧凑的单行方式将键设置为map_id变量的值,而不是必须先单独定义对象?
  3. 感谢。

4 个答案:

答案 0 :(得分:8)

  

有没有办法以紧凑的单行方式将关键字设置为map_id变量的值,而不是必须先单独定义对象?

没有。遗憾。

(除非你把两个语句放在一行用分号分隔,否则我不这样做。)

  

为什么JavaScript语法在这两种不同情况下的工作方式不同 - 为什么它们在myobj2设置为文字map_id时键入   超过100?有这种差异的原因是什么?

好问题。我不知道,我从来没有想过一个很好的理由。我认为,如果将键名称视为与JavaScript中的其他所有内容相同的表达式,那么很多会更有意义,即,如果引用({ "map_id" : 6 }),则作为文字,如果没有引用,则作为变量({map_id : 6 })。

答案 1 :(得分:1)

myobj[map_id]表示访问名称为map_id的值的属性(作为表达式)。

在您的情况下,map_id的值为100.所有对象属性必须是字符串或有效的JavaScript标识符 - 因此它将转换为字符串'100'并作为对象的属性放置。

var myobj2 = { map_id : 6 };的情况下,JavaScript解释器看到map_id是一个有效的标识符,并且不希望它是一个表达式 - 所以它不会转换成任何东西。

编辑:

关于你的第二个问题,假设你想要属性的名称是动态的(依赖于某个表达式的值),还要写:

var myobj2 = { map_id : 6 };

并将map_id替换为“its”(它不是它的值 - 两个标识符碰巧具有相同的名称 - 一个是对象属性,另一个是变量)要生成的值:

{ '100': 6 }
  • 答案是否定的,您必须通过[]
  • 来完成

答案 2 :(得分:1)

单行方式

Object.defineProperty({}, map_id, { value: 6, enumerable: true });

ES6

{ [map_id]: 6 }

答案 3 :(得分:0)

在对象文字中,键是符号而不是变量。我不相信双引号中的换行符将它们转换为字符串。相反,引号用于创建可以包含空格或其他非alphanum值的符号,例如{"\n":"this is a carriage-return"}

所以在你的例子中,' map_id'用作对象字面值中的键与变量' map_id'无关,除了它们都使用相同的字符序列作为其名称。

相关问题