Действительные имена свойств объекта 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['@£$%']);
Это действительно? Кажется, что это противоречит правилам именования переменных - или я не объявляю там переменную? Какая разница между именем переменной и именем объекта?
Ответы
Ответ 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
), вам не разрешено использовать специальные символы, отличные от _ или $; также имя не может начинаться с числа. Для всех остальных случаев вы вынуждены использовать квадратные скобки и кавычки для доступа к элементам объекта.