Я пытаюсь понять разницу между точкой и квадратной нотой. Просматривая различные примеры здесь на SO и на некоторых других сайтах, я столкнулся с этими двумя простыми примерами:
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]);
Первый пример возвращает y, который не определен, если в третьей строке я заменю obj[x]
на obj.x
Почему бы не "hello"
Но во втором примере выражение user[key]
можно просто заменить на user.key
без какого-либо аномального поведения (по крайней мере для меня). Теперь это меня смущает, поскольку я недавно узнал, что, если мы хотим получить доступ к свойствам по имени, хранящимся в переменной, мы используем Notation Notification.
В точечной нотации имя после точки - это имя ссылающегося свойства. Так:
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
Однако в квадратных скобках имя ссылочного объекта является значением того, что находится в квадратных скобках:
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
Другими словами, dot-notation obj.foo
всегда эквивалентна obj["foo"]
, а obj[foo]
зависит от значения переменной foo
.
В конкретном случае вашего вопроса обратите внимание на различия между точечной нотации и обозначением квадратной скобки:
// 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 }
Доступ/создание свойств из/в объекте JavaScript можно выполнить двумя способами
Всякий раз, когда какое-либо свойство не определено, т.е. Не присутствует в объекте, и вы пытаетесь получить к нему доступ, вы получите undefined
(очевидно, потому что его нет).
Итак, в первом примере вы получаете доступ к свойству, а во втором примере вы создаете свойство. Поэтому замена кода не повлияла на код во втором примере.