【问题标题】:Is this Javascript object literal key restriction strictly due to parsing?这个 Javascript 对象文字键限制是否严格归因于解析?
【发布时间】:2011-02-21 19:45:39
【问题描述】:

请参考下面的代码,当我“注释”任何被注释掉的行时,它会导致“':'预期”的错误(在 IE 中)。那么我的结论是正确的,即无法提供对对象值的引用,作为字符串文字中的对象键;这严格来说是解释器/解析问题吗?与 Crockford 的“好的部分”相比,这是 Javascript 的一个糟糕(或至少是“坏”)“部分”的候选者吗?

<script>
var keys = {'ONE': 'one'};

//causes error:
//var obj1 = {keys.ONE: 'value1'};
//var obj1 = {keys['ONE']: 'value1'};

//works
var obj1 = {};
obj1[keys.ONE] = 'value1';

//also works
var key_one = keys.ONE;
var obj2 = {key_one: 'value1'};
</script>

【问题讨论】:

  • 顺便说一句 var key_one = keys.ONE; var obj2 = {key_one: 'value1'}; 不像你期望的那样工作。 obj2 的属性将是 key_one 而不是 key.ONE 的值,因此不是 one
  • 请注意,尽管最后一个示例有效,但它创建了一个具有属性key_one 的对象,而不是属性keys.One。变量key_one 与下一行的字面量对象无关。
  • 知道了....这可能会令人困惑....它应该禁止所有“未引用”的字符串,或者取消引用引用,无论它们可能是什么
  • 它们在 JSON 规范中已经被禁止。但是javascript对象可以有定义为{somevar: 1, methodname:function(){ /*stuff*/ } }的方法,我想有人不喜欢把他的方法名放在引号里;)
  • @George:或者他们可能在对象文字中禁止引用名称,就像其他一些语言一样......

标签: javascript object parsing object-literal


【解决方案1】:

字面量对象语法的限制是名称必须是字面量。由于名称既可以指定为标识符也可以指定为字符串,因此不能使用变量代替。

这将创建一个具有n 属性的对象,而不是answer 属性:

var n = 'answer';
var o = { n: 42 };

【讨论】:

  • 数字文字也是有效的属性名称。此外,在 ES5 中,名称可以指定为标识符名称(即,不仅是标识符,还包括保留字)。见stackoverflow.com/a/9568622/96656
【解决方案2】:

{}定义对象时不能使用变量作为键

因此,它们被解释为字符串名称,并且只能由可用于变量名称的字符组成

objectname[anythingThatReturnsValue]='value1'; 是要走的路。

你可以生成一个字符串并解析它

var s='{"'+keys.ONE+'": "value1"}';
var obj=JSON.parse(s);
//or
s='var obj2='+s;
eval(s);

以上两种方法在 JavaScript 中创建对象都是不好的做法,我不推荐它们。

【讨论】:

  • 在使用 {} 定义对象时,您可以使用变量作为键,请参阅第二个“也有效”块。
  • @George:不,你不能。代码运行,但它不使用字面量对象中的变量。
  • @George:他的意思是syntax error,你对此无能为力:)
  • @George - 要明确:var obj2 = {key_one: 'value1'};var obj2 = {"key_one": 'value1'}; 相同 - key_one 将是字段的名称。
  • @George:澄清 Guffa 的回复:第二个“也有效”示例中的key_one 键的名称;如果您检查该对象,它将有一个名为“key_one”的属性,not“one”就像在您创建时使用 key_onevalue字面意思。
【解决方案3】:

想一想:如果它按照你想要的方式工作,那将完全引入语言歧义。

var obj = {something:"red"}
var obj = {"something":"red"}

这两个语句在 JavaScript 中是等价的,因为裸词键是“自动引用的”。因此,如果something 表示文字字符串“某物”,它如何也可以引用变量“某物”。它不能。因此,如果您想使用变量,它们必须使用方括号表示法,而不是 key : value 表示法。

【讨论】:

    【解决方案4】:

    你可以试试:

    var obj = {};
    var val = 'foo';
    
    obj[val] = 'bar'; 
    
    obj.foo >>> 'bar';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多