Подтвердить что ты не робот

Действительные имена свойств объекта javascript

Я пытаюсь выработать то, что считается действительным для имени свойства объекта javascript. Например

var b = {}
b['-^colour'] = "blue";     // Works fine in Firefox, Chrome, Safari
b['colour'] = "green";      // Ditto
alert(b['-^colour']);       // Ditto
alert(b.colour);            // Ditto
for(prop in b) alert(prop); // Ditto
//alert(b.-^colour);     // Fails (expected)

Этот пост содержит подробные имена переменных javascript, а '- ^ color' явно недействителен (как имя переменной). То же самое относится к именам объектов объектов? Глядя на вышеизложенное, я пытаюсь понять, если

  • b ['- ^ color'] недействителен, но работает во всех браузерах с помощью quirk, и я не должен доверять ему, чтобы работать в будущем

  • b ['- ^ color'] полностью допустим, но это просто форма, к которой можно получить доступ только таким образом - (она поддерживается, поэтому объекты могут использоваться как карты, возможно?)

  • Что-то еще

В стороне, глобальная переменная в javascript может быть объявлена ​​на верхнем уровне как

var abc = 0;

но также может быть создан (как я понимаю) с помощью

window['abc'] = 0;

во всех вышеперечисленных браузерах работает следующее

window['@£$%'] = "bling!";
alert(window['@£$%']);

Это действительно? Кажется, что это противоречит правилам именования переменных - или я не объявляю там переменную? Какая разница между именем переменной и именем объекта?

4b9b3361

Ответ 1

Да, объекты могут использоваться как карты, а любая строка может быть именем свойства. Как вы обнаружили, некоторые свойства могут быть доступны только с помощью синтаксиса скобок.

window['abc']

обращается к свойству. Это не переменная, хотя она относится к одному и тому же значению (на глобальном уровне) как:

abc

Ответ 2

Правила именования свойств объекта и правила именования переменных являются отдельными. Стандарт только "резервирует" несколько имен свойств (таких как prototype и constructor, IIRC), но кроме них, любая строка идет.

За исключением случаев, когда среда выполнения (т.е. браузер) решает добавить дополнительные магические свойства, конечно. (Я слышал, установка __proto__ разрывает некоторые вещи довольно странно)

Ответ 3

  • Каждый раз, когда вы создаете глобальную переменную, вы создаете на самом деле новый член глобального объекта (который window в среде браузера, global в Node.js, и т.д.). Вот почему window.x является точно таким же, как (глобальный) var x, this.x или просто x.

  • Понимание JavaScript объекта, такого как карта, совершенно справедливо, потому что: а) вы можете добавить новый элемент динамически - в любой момент; b) элемент может иметь любое имя, в том числе специальные символы, c) вы можете попытаться получить доступ к несуществующему элементу объекта/карты, и это не ошибка, d) вы можете удалить элемент из объекта.

  • Если вам нравится обращаться к членам объекта со стандартной точкой нотации (например, a.x), вам не разрешено использовать специальные символы, отличные от _ или $; также имя не может начинаться с числа. Для всех остальных случаев вы вынуждены использовать квадратные скобки и кавычки для доступа к элементам объекта.