Javascript对象中的键只能是字符串?
jshashtable指出: JavaScript的内置对象确实使用 方括号表示法 属性,前提是您的密钥 字符串或数字: 据我所知,键只是字符串(因为数字被强制转换成字符串)。我只想检查并确保上面所说的是错误的(因为键不能是数字) ECMA标准公司对此有何规定Javascript对象中的键只能是字符串?,javascript,Javascript,jshashtable指出: JavaScript的内置对象确实使用 方括号表示法 属性,前提是您的密钥 字符串或数字: 据我所知,键只是字符串(因为数字被强制转换成字符串)。我只想检查并确保上面所说的是错误的(因为键不能是数字) ECMA标准公司对此有何规定 或者实现浏览器是特定的?是的,键可以是数字。事实上,该规范对对象和数组使用了相同的通用映射函数。您是对的,键只能是字符串,而数组中使用的数字键则被强制并存储为字符串 var arr = [true]; arr[0] === true; a
或者实现浏览器是特定的?是的,键可以是数字。事实上,该规范对对象和数组使用了相同的通用映射函数。您是对的,键只能是字符串,而数组中使用的数字键则被强制并存储为字符串
var arr = [true];
arr[0] === true;
arr['0'] = false;
arr[0] === false;
ECMAScript规范,第42页:
productionPropertyName:NumericLiteral
的评估如下:
x
放在方括号中,因此对其求值,返回字符串“foo”。由于此属性在y
上尚不存在,因此添加了它。然后将y
的foo
属性赋值为“foo value”
一般来说,方括号中的表达式将被求值,并调用其toString()
方法。正是该值用作属性名称
在点属性访问方法中,不计算标识符,因此:
y.bar = 'bar value';
使用值条形图值创建属性条形图
如果要创建数值特性,请执行以下操作:
y[5] = 5;
将计算5
,查看它不是字符串,调用(或多或少)Number(5).toString()
,返回用于属性名称的字符串5
。然后为其分配值5
,这是一个数字
编辑
这个答案是在ECMAScript ed3是最新版本时写的,不过事情已经发生了变化。请参阅后面的引用和。好吧,这是我的答案——主要是因为我对其他(正确)答案中的引用不满意——[]中属性名的表达式总是与字符串一起使用,,这种行为在规范中有很好的定义。因此,根据对相关报价的解释,它可能被视为误导和/或不正确
然而,该引文并未假定x[42]
和x[“42”]
是不同的;它指出——误导性地排除了其他原语和细节——在正常的属性解析下,只有字符串和数字可用作“散列键”(真正的属性名),从这个意义上说,引用是正确的
这些规则来自
从第11.2.1节“属性访问器”(生产规则省略):
生产MemberExpression:MemberExpression[Expression]的计算如下:
让baseReference作为计算MemberExpression的结果李>
让baseValue为GetValue(baseReference)李>
让propertyNameReference作为表达式求值的结果李>
让propertyNameValue为GetValue(propertyNameReference)李>
调用CheckObjectImprovalible(baseValue)李>
将propertyNameString设置为字符串(propertyNameValue)。
如果正在计算的语法结果包含在严格模式代码中,则让strict为true,否则让strict为true
严格的要求可能是错误的
返回一个Reference类型的值,其基值为baseValue,引用的名称为
propertyNameString,其严格模式标志为strict
快乐编码。这是一个函子数组
。当使用函数式编程范例时,它很有用
javascript:
alert(["Using ",window.navigator.userAgent] );
FunctorRA=[]; f=function(){return f}; g=function(x){return x};
FunctorRA[f]=43;
FunctorRA[g(function(){})]="generic";
FunctorRA[g(g)]="idempotent";
alert(FunctorRA);
for (i in FunctorRA)
alert([ "Functor[ ", i,
"]'s\n\n value is \n\n", FunctorRA[i]].join(""));
显示:
Using ,Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423
Ubuntu/10.04 (lucid) Firefox/3.6.3
空的警报
,然后:
Functor[ function () {
return f;
}]'s
value is
43
等等
注:贝尼:
警报(functora)
显示。toString()
不枚举非数字索引
FunctorRA
是数组“衣服”中的通用对象
- 没有直接的
语法等价物(即使使用字符串eval
强制)
有关如何在函数名中嵌入冒号(:
)的详细信息,请参见,即使它通常是一个分隔符,用于在语法上描述初始值设定项prope
Functor[ function () {
return f;
}]'s
value is
43
{ "1": true }[1] // true