【问题标题】:How are keys in an object literal evaluated?如何评估对象文字中的键?
【发布时间】:2016-09-13 23:43:42
【问题描述】:

这是我的功能

function goldAndSilver(bin) {
    var gold = bin.gold;
    var silver = bin.silver;
    return { gold: gold, silver: silver };
}

为什么在执行上下文中已经遇到var gold = bin.gold 时,第一个gold 引用名称,而第二个gold 引用。线路运行后不会总是gold = number 并且返回结果应该是{5: 5} 而不是{gold: 5}

【问题讨论】:

  • @IrkenInvader 说了什么。我想您只是对代码的运行方式感到好奇,但如果您真的想要 {5: 5},我会说(在大多数情况下){gold: 5} 是一个更有意义的对象结构。
  • 标题和标签似乎与您的实际问题没有任何关系。我更新/简化了你的问题。如果您不喜欢它,请随时恢复。

标签: javascript object-literal


【解决方案1】:

使用这种表示法{ gold: gold, silver: silver },冒号前的单词始终是名称,它从不指代变量。

如果您想使用变量作为对象属性的名称,可以这样做:

var gold = 5;
var obj = {};
obj[gold] = gold;

这会导致 Object {5: 5}

【讨论】:

  • 请注意,JavaScript 仅使用字符串作为对象键,因此上述代码的结果对象将是 {"5": 5}
  • 它只使用字符串,但它的语法允许不带引号的标识符,5 是一个有效的属性标识符,就像goldsliver 一样。
  • 在支持它的浏览器中,您也可以使用计算名称:ecma specMDN reference{[gold]:gold}
  • @TimoSta -- 你确定吗?当我打开 chromes 控制台并执行var x = {5:5} - 我在日志输出中得到Object {5: 5}
  • @tymeJV,这是因为控制台没有显示属性名称的引号。但是 TimoSta 的错误在于 Javascript 只使用 Strings 作为属性 keys,它也可以使用 Symbols: 所有 String 和 Symbol 值,包括空字符串,都可以作为属性有效键。属性 name 是一个属性键,它是一个字符串值。至于数字:整数索引是字符串值的属性键
【解决方案2】:

否,因为默认情况下不计算对象键。该属性将被赋予您命名的确切名称。但是,在 ES2015 中,您可以使用 computed property names,它允许您使用动态值命名属性。

(请注意,这只适用于支持新语法的浏览器):

var gold = 5;
var obj = {
  [gold]: gold
};

document.write('<pre>' + JSON.stringify(obj, null, 2) + '</pre>');

【讨论】:

    【解决方案3】:

    这是对象符号。这里':'之前的第一个单词是关键。它始终是一个字符串。这就像为您要分配的值分配一个名称。第二个是价值。 在这种表示法中,您不能将变量分配为键。键始终是常量和字符串。

    { gold: gold, silver: silver }
    is same as
    var obj = { 'gold': gold, 'silver': silver }
    

    要将变量指定为键,您必须使用方括号表示法。

     var key1='gold';
     var key2='silver';
     var obj={};
     // assuming gold and silver to defined
     obj[key1]=gold;
     obj[key2]=silver;
    

    在这两种情况下,obj 是相同的。但是,如果在分配值之前知道键名,则可以使用第二种格式。

    例如,让我们看看克隆对象的代码(一级):

    function clone(original){
      var clone={};
      for(var key in original){
      // Dont know what is the value of key. So we need to use square
      //bracket. clone.key would be incorrect to use because it would be
      //considered string.
    
      clone[key]=original[key];
      }
     return clone;
    } 
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多