Javascript对象中的键只能是字符串?

Javascript对象中的键只能是字符串?,javascript,Javascript,jshashtable指出: JavaScript的内置对象确实使用 方括号表示法 属性,前提是您的密钥 字符串或数字: 据我所知,键只是字符串(因为数字被强制转换成字符串)。我只想检查并确保上面所说的是错误的(因为键不能是数字) ECMA标准公司对此有何规定 或者实现浏览器是特定的?是的,键可以是数字。事实上,该规范对对象和数组使用了相同的通用映射函数。您是对的,键只能是字符串,而数组中使用的数字键则被强制并存储为字符串 var arr = [true]; arr[0] === true; a

jshashtable指出:

JavaScript的内置对象确实使用 方括号表示法 属性,前提是您的密钥 字符串或数字:

据我所知,键只是字符串(因为数字被强制转换成字符串)。我只想检查并确保上面所说的是错误的(因为键不能是数字)

ECMA标准公司对此有何规定


或者实现浏览器是特定的?

是的,键可以是数字。事实上,该规范对对象和数组使用了相同的通用映射函数。

您是对的,键只能是字符串,而数组中使用的数字键则被强制并存储为字符串

var arr = [true];
arr[0] === true;
arr['0'] = false;
arr[0] === false;
ECMAScript规范,第42页:

production
PropertyName:NumericLiteral
的评估如下:

  • 形成NumericLiteral的值
  • 返回到字符串(结果(1))
  • JavaScript的内置对象确实使用 属性的方括号表示法,前提是您的键 字符串或数字

    这似乎不正确-始终是字符串可能是字符串或(自ECMAScript 2015,又名ECMA-262 ed 6以来)符号。但这与方括号属性访问是不同的主题

    参见ECMA-262第3版§11.2.1(另请参见):

    属性通过名称访问,使用点表示法:

    成员表达式。识别名

    调用表达式。识别名

    或括号符号:

    成员表达式[表达式]

    调用表达式[表达式]

    点表示法通过以下语法转换进行解释:

    成员表达式。识别名

    其行为与

    成员表达式[]

    同样地

    调用表达式。识别名

    其行为与

    调用表达式[]

    其中是包含 处理Unicode转义后的相同字符序列 序列作为标识名

    因此,当使用点表示法时,点后的位必须符合标识符名称的标准。但当使用方括号时,会提供一个表达式,该表达式将被求值并解析为字符串

    简单地说,提供方括号表示法是为了使用表达式访问属性,例如

    在上面的例子中,
    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