在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 }
问题:
myobj2
而不是map_id
的关键字是100
?这种差异背后的原因是什么?map_id
变量的值,而不是必须先单独定义对象?感谢。
答案 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'无关,除了它们都使用相同的字符序列作为其名称。