In JavaScript, you can define an object like this:
var d = {1: 'test'};
and I can set a key with a negative number index like this:
d[-1] = 'test2';
but if I try to use a negative number in the literal initialization, I get an error:
var d = {1: 'test', -1: 'test2'};
Uncaught SyntaxError: Unexpected token -
Why is this? Why can't I use a literal negative number as a key to an object? Is there a workaround that allows me to initialize it as a literal. I know I could use strings instead, but I want to use integers.
Its because
-1
isn't a valid variable identifier.Change to
Identifiers, that are keywords or can not be a normal identifier for other reasons, can still be used if surrounded by quotes.
I'm not sure exactly why, but you have to quote the negative number in the object initializer:
All object keys are treated as strings internally, so you can address this key using either:
Interesting question.
The thing is, there's no difference between typing
and
You can verify this by doing:
Notice that it only has one "24" property (and fails in strict mode).
So while this doesn't explain why you can't do -1 without quotes, hopefully it does explain that "-1" is just as good.
Interestingly, unquoted fractional numbers seem to work fine.
Edit: Felix Kling explains why it doesn't work in a comment on another answer.
-1
isn't a numeric literal, it's an expression with a numeric literal and a unary-
operator -- therefore it's not suitable as an object key.From Unquoted property names / object keys in JavaScript, my write-up on the subject:
-1
is not a numeric literal, it’s a unary-
operator followed by a numeric literal (1
).I also made a tool that will tell you if any given property name can be used without quotes and/or with dot notation. Try it at mothereff.in/js-properties.
When the key contains certain characters, you have to put it in quotes like this:
Here's a pretty good reference on what characters are allowed without the quoting and it has a specific section about object property declaration too: http://asenbozhilov.com/articles/identifiers-en.html#identifier_start.