Я пытаюсь разработать то, что считают допустимым для названия свойства объекта 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, и '-^colour' ясно не допустим (как имя переменной). То же относится к именам свойства объекта? При взгляде на вышеупомянутое я пытаюсь удаться если
b ['-^colour'] недопустимо, но работает во всех браузерах причудой, и я не должен доверять ее для работы, продвигаясь
b ['-^colour'] абсолютно допустимо, но это просто имеет форму, к которой можно только получить доступ этим способом - (это поддерживается так, Объекты могут использоваться в качестве карт, возможно?)
Что-то еще
Как в стороне, глобальная переменная в JavaScript могла бы быть объявлена на верхнем уровне как
var abc = 0;
но мог также быть создан (насколько я понимаю) с
window['abc'] = 0;
следующие работы во всех вышеупомянутых браузерах
window['@£$%'] = "bling!";
alert(window['@£$%']);
Действительно ли это допустимо? Это, кажется, противоречит переменным правилам именования - или разве я не объявляю переменную там? Каково различие между переменной и именем свойства объекта?
Да, объекты можно использовать как карты, и любая строка может быть именем свойства. Как вы обнаружили, к некоторым свойствам можно получить доступ только с использованием синтаксиса скобок.
window['abc']
обращается к свойству. Это не переменная, хотя она относится к тому же значению (на глобальном уровне), как:
abc
Правила именования свойств объектов и правила именования переменных являются отдельными. Стандарт "резервирует" только несколько имен свойств (например, prototype
и constructor
, IIRC), но кроме них, можно использовать любые строки.
За исключением тех случаев, когда среда выполнения (т.е. браузер) решает добавить больше магических свойств, конечно. (Я слышал, что установка __proto__
ломает некоторые вещи довольно странным образом)