Точки и квадратные скобки

1

Я пытаюсь понять разницу между точкой и квадратной нотой. Просматривая различные примеры здесь на 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.

Теги:
syntax
square-bracket

2 ответа

4
Лучший ответ

В точечной нотации имя после точки - это имя ссылающегося свойства. Так:

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 }
  • 0
    Эй, Frxstrem, не могу тебя отблагодарить, твои примеры и твои объяснения сняли все мои сомнения по поводу этой темы, и теперь это такое облегчение ...: D Спасибо большое ...
0

Доступ/создание свойств из/в объекте JavaScript можно выполнить двумя способами

  1. Использование нотации Dot
  2. Использование обозначения квадратной скобки

Всякий раз, когда какое-либо свойство не определено, т.е. Не присутствует в объекте, и вы пытаетесь получить к нему доступ, вы получите undefined (очевидно, потому что его нет).

Итак, в первом примере вы получаете доступ к свойству, а во втором примере вы создаете свойство. Поэтому замена кода не повлияла на код во втором примере.

  • 0
    Спасибо Пратюш, что нашли время.
  • 0
    Эта строка действительно помогла мне: «Всякий раз, когда какое-либо свойство не определено, т.е. отсутствует в объекте, и вы попытаетесь получить к нему доступ, вы получите неопределенное»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню