使用连接(动态)字符串作为JavaScript对象键?

时间:2012-03-14 18:45:57

标签: javascript syntax object-literal

var test = "test123"
var test123 ={
    "key" + test: 123
}

此代码不起作用。 “关键”+测试有什么问题?

6 个答案:

答案 0 :(得分:64)

因为"key" + test是一个表达式而不是标识符,也不是字符串文字,也不是数字文字,这是唯一允许作为对象文字中的键的内容。

在为这样的动态密钥创建对象后,您必须使用[]表示法:

var test123 = {};
test123["key" + test] = 123;

标识符基本上是您可以调用变量的字符子集(字母,数字,_$;可能不以数字开头),字符串文字是任何字符串随附'"

因此,您可以在对象文字中使用的唯一键类型是:

{
  a0:   true, // valid identifier
  $$_:  true, // same
  123:  true, // valid numeric literal
  012:  true, // same (octal)
  0xf:  true, // same (hex)
  "@":  true, // not allowed as an identifier
  '0a': true  // same
}

参考:http://es5.github.com/#x11.1.5

  

PropertyName

     

IdentifierName

     

串文字

     

NumericLiteral

答案 1 :(得分:42)

使用ES6,您可以在对象文字中定义动态键:

const test = "test123"
const test123 = { [`key${test}`]: 123 };  //{ keytest123: 123 }

答案 2 :(得分:10)

你可以但不能使用文字符号(ES6之前)。

var test123 = {};
test123["foo" + "bar"] = 'baz';

test123.foobar === 'baz'; // true

答案 3 :(得分:3)

您的代码相当于test123.("key" + test) = 123,这可能更能帮助您了解错误原因。

您需要["name"]表示法才能按字符串中的名称访问字段。其他符号(您和.之一)需要标识符。

答案 4 :(得分:2)

Javascript提供了两种定义对象属性的方法:

  1. object.propertyName = value;
  2. 在这种情况下,propertyName是不可编辑的,并且是不可计算的。你不能做到以下几点:

        object.('property'+'Name')
    

    你可以看到

        object = {propertyName:value};
        object = {'propertyName':value};
    

    他们是平等的

    1. 您可以使用变量作为属性名称,使用“[]”;
    2. 你可以这样做:

       var a  = "propertyName";
       object[a] = value;
      

      这次你必须使用字符串

      object[propertyName] = value;//error
      object["propertyName"] = value;//correct
      object = {'propertyName':value};//correct
      object = {propertyName:value};//correct
      

答案 5 :(得分:-2)

--HTML--
<div id="name1"></div>
<div id="name2"></div>
<div id="name3"></div>

--JS--
  function getJsonData(){
   var hr = new XMLHttpRequest();
   hr.open("GET", "bookJson.json", true);
   hr.setRequestHeader("Content-type", "application/json", true);
   hr.onreadystatechange = function() {
  if(hr.readyState == 4 && hr.status == 200) {

     var data = JSON.parse(hr.responseText);
   for(var i=0;i<3;i++){
     var a = "p"+(i+1)+"H";
     $("#name"+(i+1)).html(data[objName][a]);
     }


   }

 }
  hr.send(null);
}

---JSON--- save JSON file name as bookJson.json
 { "objName":
   {
    "p1H":"content1",
    "p2H":"content2",
    "p3H":"content3",
   }
  }
----------------------------------- 
 json object key name p1H,p2H,p3H ... 
 We want to dynamically get this keys in javacript instead of   **data[objName].p1H**. you can get dynamical key like **data[objName]["p1H"]**