【问题标题】:Accessing an array element inside JSON Object访问 JSON 对象内的数组元素
【发布时间】:2015-04-10 04:17:23
【问题描述】:

无意中,在我的项目中,我使用了以下代码,我惊讶地发现它正在工作:

HTML

<span id="output"></span>

Javascript

var myObject = {
  'a': '----First---',
  'b': '----Second---',
  'c': '----Third----'
};

var myArray = ['a'];

// First Case
output.innerHTML = myObject[myArray];

var myArray2 = ['b'];

// Second Case
output.innerHTML += myObject[myArray2];

var myArray3 = ['a', 'b'];

// Third Case 
output.innerHTML += myObject[myArray3];

输出

----First-------Second---undefined

Jsbin 链接:http://jsbin.com/godilosifu/1/edit?html,js,output

我直接访问 Object 中的数组引用,这在所有情况下都应该是未定义的,但奇怪的是,当数组的大小为 1 时,它总是获取第一个元素并将其用作对象键。

我只想知道这个概念叫什么,为什么会这样?

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    因为属性名称必须是字符串,所以使用toString() 方法将其类型转换为一个。您的第三个示例未定义的原因是 ['a', 'b'].toString() 等于 'a,b',这不是您对象中的属性。

    属性名称

    属性名称必须是字符串。这意味着非字符串对象 不能用作对象中的键。任何非字符串对象,包括 一个数字,通过 toString 方法被类型转换为字符串。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors

    值得注意的是,在 ECMAScript 6 中,有一个名为 Map 的新集合类型,它允许您使用任何对象作为键而无需类型强制。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

    【讨论】:

      【解决方案2】:

      当您将数组作为 Key 传递给对象时,它会在其上调用 toString()。这是因为 Javascript 中的所有键都是字符串。

      ['a'].toString() is "a"
      myObject['a'] is "----First----"
      

      见:Keys in Javascript objects can only be strings?

      【讨论】:

        【解决方案3】:

        它是自动投射的。在 Javascript 中,只有字符串可以作为对象属性的索引。 myObject 不是一个数组,它是一个对象。即使您使用方括号来访问它的属性,它与数组对象上使用的方括号的含义不同。

        由于对象属性只允许用字符串命名,编译器会自动将您的数组转换为字符串(本质上调用它的本机 toString() 函数,对于数组,它用逗号连接所有元素)。

        因此,当您将数组传递给对象的属性访问器/索引时,它会这样做:

        myArray1 ==> "a";
        myArray2 ==> "b";
        myArray3 ==> "a" + "," + "b" ===> "a,b";
        

        【讨论】:

          猜你喜欢
          • 2019-09-30
          • 1970-01-01
          • 2016-02-27
          • 2019-07-02
          • 1970-01-01
          • 2016-02-02
          • 1970-01-01
          • 1970-01-01
          • 2014-06-10
          相关资源
          最近更新 更多