Reputation: 12561
Please refer to the code below, when I "comment in" either of the commented out lines, it causes the error (in IE) of "':' expected". So then is my conclusion correct, that this inability to provide a reference to an object value, as an object key in a string literal; is this strictly an interpreter/parsing issue? Is this a candidate for an awful (or at least "bad") "part" of Javascript, in contrast to Crockford's "good parts"?
<script>
var keys = {'ONE': 'one'};
//causes error:
//var obj1 = {keys.ONE: 'value1'};
//var obj1 = {keys['ONE']: 'value1'};
//works
var obj1 = {};
obj1[keys.ONE] = 'value1';
//also works
var key_one = keys.ONE;
var obj2 = {key_one: 'value1'};
</script>
Upvotes: 10
Views: 5545
Reputation: 6411
You can try:
var obj = {};
var val = 'foo';
obj[val] = 'bar';
obj.foo >>> 'bar';
Upvotes: 1
Reputation: 16915
You cannot use variables as keys when defining object with {}
Therefore they are being interpreted as string names and can consist only of characters avaliable for variable names
the
objectname[anythingThatReturnsValue]='value1';
is the way to go.
ALSO
You can generate a string and parse it
var s='{"'+keys.ONE+'": "value1"}';
var obj=JSON.parse(s);
//or
s='var obj2='+s;
eval(s);
Both above methods are bad practices for creating objects in JavaScript and I don't recommend them.
Upvotes: 6
Reputation: 28100
Think about it: if it were to work the way you want it would totally introduce a language ambiguity.
var obj = {something:"red"}
var obj = {"something":"red"}
The two statements are equivalent in JavaScript, because bareword keys are "autoquoted." So if something
means the literal string "something", how it could also refer to the variable "something". It can't. So if you want to use variables they have to go in square bracket notation instead of key : value
notation.
Upvotes: 2
Reputation: 700372
The limitation of the literal object syntax is that the names has to be literal. As the names can be specified as an identifer as well as a string, it's not possible to use a variable instead.
This will create an object with a property n
, not a property answer
:
var n = 'answer';
var o = { n: 42 };
Upvotes: 15