I'm trying to understand the difference between the Dot and the Square Bracket Notation. While going through various examples here on SO and on some other sites, I came across these two simple examples:
var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello
var user = {
name: "John Doe",
age: 30
};
var key = prompt("Enter the property to modify","name or age");
var value = prompt("Enter new value for " + key);
user[key] = value;
alert("New " + key + ": " + user[key]);
The first example returns y to be undefined if in third line I replace the obj[x]
with obj.x
. Why not "hello"
But in the second example the expression user[key]
can simply be replaced with user.key
without any anomalous behavior (at-least to me).
Now this confuses me as I recently learned that if we want to access properties by name stored in a variable, we use the [ ] Square bracket Notation.
In dot notation, the name after the dot is the name of the property being referenced. So:
var foo = "bar";
var obj = { foo: 1, bar: 2 };
console.log(obj.foo) // = 1, since the "foo" property of obj is 1,
// independent of the variable foo
However, in square-bracket notation, the name of the property being referenced is the value of whatever is in the square brackets:
var foo = "bar";
var obj = { foo: 1, bar: 2 };
console.log(obj[foo]) // = 2, since the value of the variable foo is "bar" and
// the "bar" property of obj is 2
console.log(obj["foo"]) // = 1, since the value of the literal "foo" is "foo" and
// the "foo" property of obj is 1
In other words, dot-notation obj.foo
is always equivalent to obj["foo"]
, while obj[foo]
depends on the value of the variable foo
.
In the specific case of your question, note the differences between dot notation and square-bracket notation:
// with dot notation
var obj = { name: "John Doe", age: 30 };
var key = "age";
var value = 60;
obj.key = value; // referencing the literal property "key"
console.log(obj) // = { name: "John Doe", age: 30, key: 60 }
// with square bracket notation
var obj = { name: "John Doe", age: 30 };
var key = "age";
var value = 60;
obj[key] = value; // referencing property by the value of the key variable ("age")
console.log(obj) // = { name: "John Doe", age: 60 }