我正在尝试找出对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)
Run Code Online (Sandbox Code Playgroud)
这篇文章详细介绍了有效的javascript变量名称,' - ^ color'显然无效(作为变量名).这同样适用于对象属性名称吗?看看上面我试图解决的问题
b [' - ^ color']无效,但可以在所有浏览器中使用quirk,我不应该相信它可以继续工作
b [' - ^ color']是完全有效的,但它只是一种只能以这种方式访问的形式 - (它支持所以对象可以用作地图吗?)
还有别的
顺便说一句,javascript中的全局变量可能会在顶层声明为
var abc = 0;
Run Code Online (Sandbox Code Playgroud)
但也可以创建(据我所知)
window['abc'] = 0;
Run Code Online (Sandbox Code Playgroud)
以下适用于所有上述浏览器
window['@£$%'] = "bling!";
alert(window['@£$%']);
Run Code Online (Sandbox Code Playgroud)
这有效吗?它似乎与变量命名规则相矛盾 - 或者我不是在那里声明变量?变量和对象属性名称之间有什么区别?
Mat*_*hen 61
是的,对象可以用作映射,任何字符串都可以是属性名称.正如您所发现的,只能使用括号语法访问某些属性.
window['abc']
Run Code Online (Sandbox Code Playgroud)
正在访问一个属性.它不是变量,即使它引用相同的值(在全局级别):
abc
Run Code Online (Sandbox Code Playgroud)
Mat*_*nen 14
对象属性命名规则和变量命名规则是分开的.该标准仅"保留"少数属性名称(例如prototype
和constructor
IIRC),但除此之外,任何字符串都会出现.
当然,除非执行环境(即浏览器)决定添加更多魔术属性.(我听说设置__proto__
以非常奇怪的方式打破了一些东西)
小智 8
每次创建全局变量时,实际上都会创建一个全局对象的新成员(window
在浏览器环境中,global
在Node.js中等).这就是为什么window.x
与(全局)完全相同var x
,this.x
或者只是x
.
像地图一样理解JavaScript 对象是非常正确的,因为:a)您可以随时动态添加新元素; b)元素可以有任何名称 - 也包括特殊字符,c)您可以尝试访问对象/映射的不存在的元素,这不是错误,d)您可以从对象中删除元素.
如果您想使用标准点表示法(例如a.x
)访问对象成员,则不允许使用与_或$不同的任何特殊字符; 名称也不能从一个数字开始.对于所有其他情况,您不得不使用方括号和引号来访问对象元素.
归档时间: |
|
查看次数: |
49158 次 |
最近记录: |