Use a concatenated (dynamic) string as JavaScript object key?

thinkanotherone picture thinkanotherone · Mar 14, 2012 · Viewed 70k times · Source
var test = "test123"
var test123 ={
    "key" + test: 123
}

This code doesn't work. What is wrong with "key" + test ?

Answer

pimvdb picture pimvdb · Mar 14, 2012

Because "key" + test is an expression and not an identifier nor a string literal nor a number literal, which are the only things that are allowed as the key in an object literal.

You have to use the [] notation after creating the object for such a dynamic key:

var test123 = {};
test123["key" + test] = 123;

An identifier is basically the same subset of characters that you can call a variable (letters, numbers, _ and $; may not start with a number), and a string literal is any string enclosed with ' or ".

So, the only types of keys you can use in an object literal are:

{
  a0:   true, // valid identifier
  $$_:  true, // same
  123:  true, // valid numeric literal
  012:  true, // same (octal)
  0xf:  true, // same (hex)
  "@":  true, // not allowed as an identifier
  '0a': true  // same
}

Reference: http://es5.github.com/#x11.1.5.

PropertyName :

IdentifierName

StringLiteral

NumericLiteral